@sqlrooms/room-shell 0.26.0-rc.3 → 0.26.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { ProgressModal, SpinnerPane } from '@sqlrooms/ui';
3
3
  import { MosaicLayout, getVisibleMosaicLayoutPanels } from '@sqlrooms/layout';
4
4
  import { Suspense, useCallback, useMemo } from 'react';
5
- import { useBaseRoomShellStore } from './RoomShellStore';
5
+ import { useBaseRoomShellStore } from './RoomShellSlice';
6
6
  export const RoomShell = () => {
7
- const layout = useBaseRoomShellStore((state) => state.config.layout);
7
+ const layout = useBaseRoomShellStore((state) => state.layout.config);
8
8
  const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
9
9
  const panels = useBaseRoomShellStore((state) => state.layout.panels);
10
10
  const loadingProgress = useBaseRoomShellStore((state) => state.room.getLoadingProgress());
@@ -1 +1 @@
1
- {"version":3,"file":"RoomBuilder.js","sourceRoot":"","sources":["../src/RoomBuilder.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAC5E,OAAc,EAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAa,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,qBAAqB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,KAAgC,EAAE,EAAE;QACnC,oDAAoD;QACpD,SAAS,CAAC,EAAC,GAAG,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAC;IAEF,MAAM,cAAc,GAAiC,OAAO,CAAC,GAAG,EAAE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,CACL,EAAE,EACF,KAAC,aAAa,cACZ,KAAC,SAAS,KAAG,GACC,CACjB,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,KAAC,aAAa,cACZ,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,WAAW,IAAC,CAAC,EAAC,MAAM,GAAG,aAC1C,cAAK,SAAS,EAAC,+DAA+D,YAC3E,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,YAAY,IACX,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,4BAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,EACjD,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,aAAa,IACZ,MAAM,EAAE,eAAe,KAAK,SAAS,EACrC,KAAK,EAAC,SAAS,EACf,YAAY,EAAE,eAAe,EAAE,OAAO,EACtC,aAAa,EAAE,IAAI,GAEnB,IACO,GACG,CACjB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {ProgressModal, SpinnerPane} from '@sqlrooms/ui';\nimport {MosaicLayout, getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport React, {Suspense, useCallback, useMemo} from 'react';\nimport type {MosaicNode} from 'react-mosaic-component';\nimport {useBaseRoomShellStore} from './RoomShellStore';\n\nexport const RoomShell: React.FC = () => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n const renderedPanels: Map<string, React.ReactNode> = useMemo(() => {\n return Array.from(visibleRoomPanels).reduce((acc, id: string) => {\n const PanelComp = panels[id]?.component;\n if (PanelComp) {\n acc.set(\n id,\n <ErrorBoundary>\n <PanelComp />\n </ErrorBoundary>,\n );\n }\n return acc;\n }, new Map<string, React.ReactNode>());\n }, [ErrorBoundary, panels, visibleRoomPanels]);\n\n return (\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <div className=\"flex h-full w-full flex-grow flex-col items-stretch px-0 pb-0\">\n {layout ? (\n <MosaicLayout\n renderTile={(id) => <>{renderedPanels.get(id)}</>}\n value={layout.nodes}\n onChange={handleLayoutChange}\n />\n ) : null}\n </div>\n\n <ProgressModal\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n </Suspense>\n </ErrorBoundary>\n );\n};\n"]}
1
+ {"version":3,"file":"RoomBuilder.js","sourceRoot":"","sources":["../src/RoomBuilder.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAC5E,OAAc,EAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAa,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,qBAAqB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,KAAgC,EAAE,EAAE;QACnC,oDAAoD;QACpD,SAAS,CAAC,EAAC,GAAG,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAC;IAEF,MAAM,cAAc,GAAiC,OAAO,CAAC,GAAG,EAAE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,CACL,EAAE,EACF,KAAC,aAAa,cACZ,KAAC,SAAS,KAAG,GACC,CACjB,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,KAAC,aAAa,cACZ,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,WAAW,IAAC,CAAC,EAAC,MAAM,GAAG,aAC1C,cAAK,SAAS,EAAC,+DAA+D,YAC3E,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,YAAY,IACX,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,4BAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,EACjD,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,aAAa,IACZ,MAAM,EAAE,eAAe,KAAK,SAAS,EACrC,KAAK,EAAC,SAAS,EACf,YAAY,EAAE,eAAe,EAAE,OAAO,EACtC,aAAa,EAAE,IAAI,GAEnB,IACO,GACG,CACjB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {ProgressModal, SpinnerPane} from '@sqlrooms/ui';\nimport {MosaicLayout, getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport React, {Suspense, useCallback, useMemo} from 'react';\nimport type {MosaicNode} from 'react-mosaic-component';\nimport {useBaseRoomShellStore} from './RoomShellSlice';\n\nexport const RoomShell: React.FC = () => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n const renderedPanels: Map<string, React.ReactNode> = useMemo(() => {\n return Array.from(visibleRoomPanels).reduce((acc, id: string) => {\n const PanelComp = panels[id]?.component;\n if (PanelComp) {\n acc.set(\n id,\n <ErrorBoundary>\n <PanelComp />\n </ErrorBoundary>,\n );\n }\n return acc;\n }, new Map<string, React.ReactNode>());\n }, [ErrorBoundary, panels, visibleRoomPanels]);\n\n return (\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <div className=\"flex h-full w-full flex-grow flex-col items-stretch px-0 pb-0\">\n {layout ? (\n <MosaicLayout\n renderTile={(id) => <>{renderedPanels.get(id)}</>}\n value={layout.nodes}\n onChange={handleLayoutChange}\n />\n ) : null}\n </div>\n\n <ProgressModal\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n </Suspense>\n </ErrorBoundary>\n );\n};\n"]}
@@ -1,9 +1,8 @@
1
- import { RoomStore } from '@sqlrooms/room-store';
2
- import { BaseRoomConfig } from '@sqlrooms/room-config';
3
1
  import { FC, PropsWithChildren } from 'react';
4
- export declare function RoomShellBase<PC extends BaseRoomConfig>({ className, children, roomStore, }: React.PropsWithChildren<{
2
+ import { RoomShellStore } from './RoomShellSlice';
3
+ export declare function RoomShellBase({ className, children, roomStore, }: React.PropsWithChildren<{
5
4
  className?: string;
6
- roomStore?: RoomStore<PC>;
5
+ roomStore?: RoomShellStore;
7
6
  }>): import("react/jsx-runtime").JSX.Element;
8
7
  export declare const RoomSidebar: FC<PropsWithChildren<{
9
8
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AASrD,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAQnE,wBAAgB,aAAa,CAAC,EAAE,SAAS,cAAc,EAAE,EACvD,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC3B,CAAC,2CAaD;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CAenE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBAzFsC,MAAM;;;;;;;;qBA5B/D,CAAC;;;;;oBA8CU,MAAM;wBACF,MAAM;;;oBAsDsB,MAAM;;CAqBlD,CAAC"}
1
+ {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAMnE,OAAO,EAAC,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAEvE,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC,2CAaD;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CAenE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBAzFsC,MAAM;;;;;;;;qBAzBnD,CAAC;;;;;oBA2CF,MAAM;wBACF,MAAM;;;oBAsDsB,MAAM;;CAqBlD,CAAC"}
package/dist/RoomShell.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { RoomStateProvider } from '@sqlrooms/room-store';
3
2
  import { MosaicLayout } from '@sqlrooms/layout';
3
+ import { RoomStateProvider } from '@sqlrooms/room-store';
4
4
  import { cn, ErrorBoundary, ProgressModal, SpinnerPane, Toaster, TooltipProvider, } from '@sqlrooms/ui';
5
5
  import { Suspense, useCallback } from 'react';
6
6
  import { RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
7
- import { useBaseRoomShellStore } from './RoomShellStore';
7
+ import { useBaseRoomShellStore } from './RoomShellSlice';
8
8
  export function RoomShellBase({ className, children, roomStore, }) {
9
9
  return (_jsx(RoomStateProvider, { roomStore: roomStore, children: _jsx("div", { className: cn('flex h-full w-full', className), children: _jsx(ErrorBoundary, { children: _jsxs(Suspense, { fallback: _jsx(SpinnerPane, { h: "100%" }), children: [_jsx(TooltipProvider, { children: children }), _jsx(Toaster, {})] }) }) }) }));
10
10
  }
@@ -12,7 +12,7 @@ export const RoomSidebar = ({ className, children, }) => {
12
12
  return (_jsxs("div", { className: cn('bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4', className), children: [_jsx(RoomShellSidebarButtons, {}), children] }));
13
13
  };
14
14
  export const LayoutComposer = ({ className, tileClassName }) => {
15
- const layout = useBaseRoomShellStore((state) => state.config.layout);
15
+ const layout = useBaseRoomShellStore((state) => state.layout.config);
16
16
  const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
17
17
  const panels = useBaseRoomShellStore((state) => state.layout.panels);
18
18
  const ErrorBoundary = useBaseRoomShellStore((state) => state.room.CustomErrorBoundary);
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {RoomStateProvider, RoomStore} from '@sqlrooms/room-store';\nimport {MosaicLayout} from '@sqlrooms/layout';\nimport {BaseRoomConfig} from '@sqlrooms/room-config';\nimport {\n cn,\n ErrorBoundary,\n ProgressModal,\n SpinnerPane,\n Toaster,\n TooltipProvider,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, Suspense, useCallback} from 'react';\nimport {MosaicNode} from 'react-mosaic-component';\nimport {\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\nimport {useBaseRoomShellStore} from './RoomShellStore';\n\nexport function RoomShellBase<PC extends BaseRoomConfig>({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomStore<PC>;\n}>) {\n return (\n <RoomStateProvider roomStore={roomStore}>\n <div className={cn('flex h-full w-full', className)}>\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <TooltipProvider>{children}</TooltipProvider>\n <Toaster />\n </Suspense>\n </ErrorBoundary>\n </div>\n </RoomStateProvider>\n );\n}\n\nexport const RoomSidebar: FC<PropsWithChildren<{className?: string}>> = ({\n className,\n children,\n}) => {\n return (\n <div\n className={cn(\n 'bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4',\n className,\n )}\n >\n <RoomShellSidebarButtons />\n {children}\n </div>\n );\n};\n\nexport const LayoutComposer: FC<{\n className?: string;\n tileClassName?: string;\n}> = ({className, tileClassName}) => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n // const visibleRoomPanels = useMemo(\n // () => getVisibleMosaicLayoutPanels(layout?.nodes),\n // [layout],\n // );\n\n const renderTile = (panelId: string) => {\n // const panelId = visibleRoomPanels.find((p) => p === id);\n const PanelComp = panelId && panels[panelId]?.component;\n if (!PanelComp) {\n return null;\n }\n return (\n <ErrorBoundary key={panelId}>\n <PanelComp />\n </ErrorBoundary>\n );\n };\n\n return (\n <div\n className={cn(\n 'flex h-full w-full flex-grow flex-col items-stretch',\n className,\n )}\n >\n {layout ? (\n <MosaicLayout\n renderTile={renderTile}\n value={layout.nodes}\n onChange={handleLayoutChange}\n tileClassName={tileClassName}\n />\n ) : null}\n </div>\n );\n};\n\nexport const LoadingProgress: FC<{className?: string}> = ({className}) => {\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n return (\n <ProgressModal\n className={className}\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n );\n};\n\nexport const RoomShell = Object.assign(RoomShellBase, {\n Sidebar: RoomSidebar,\n SidebarButton: SidebarButton,\n LayoutComposer: LayoutComposer,\n LoadingProgress: LoadingProgress,\n});\n"]}
1
+ {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {MosaicLayout} from '@sqlrooms/layout';\nimport {RoomStateProvider} from '@sqlrooms/room-store';\nimport {\n cn,\n ErrorBoundary,\n ProgressModal,\n SpinnerPane,\n Toaster,\n TooltipProvider,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, Suspense, useCallback} from 'react';\nimport {MosaicNode} from 'react-mosaic-component';\nimport {\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\nimport {RoomShellStore, useBaseRoomShellStore} from './RoomShellSlice';\n\nexport function RoomShellBase({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomShellStore;\n}>) {\n return (\n <RoomStateProvider roomStore={roomStore}>\n <div className={cn('flex h-full w-full', className)}>\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <TooltipProvider>{children}</TooltipProvider>\n <Toaster />\n </Suspense>\n </ErrorBoundary>\n </div>\n </RoomStateProvider>\n );\n}\n\nexport const RoomSidebar: FC<PropsWithChildren<{className?: string}>> = ({\n className,\n children,\n}) => {\n return (\n <div\n className={cn(\n 'bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4',\n className,\n )}\n >\n <RoomShellSidebarButtons />\n {children}\n </div>\n );\n};\n\nexport const LayoutComposer: FC<{\n className?: string;\n tileClassName?: string;\n}> = ({className, tileClassName}) => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n // const visibleRoomPanels = useMemo(\n // () => getVisibleMosaicLayoutPanels(layout?.nodes),\n // [layout],\n // );\n\n const renderTile = (panelId: string) => {\n // const panelId = visibleRoomPanels.find((p) => p === id);\n const PanelComp = panelId && panels[panelId]?.component;\n if (!PanelComp) {\n return null;\n }\n return (\n <ErrorBoundary key={panelId}>\n <PanelComp />\n </ErrorBoundary>\n );\n };\n\n return (\n <div\n className={cn(\n 'flex h-full w-full flex-grow flex-col items-stretch',\n className,\n )}\n >\n {layout ? (\n <MosaicLayout\n renderTile={renderTile}\n value={layout.nodes}\n onChange={handleLayoutChange}\n tileClassName={tileClassName}\n />\n ) : null}\n </div>\n );\n};\n\nexport const LoadingProgress: FC<{className?: string}> = ({className}) => {\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n return (\n <ProgressModal\n className={className}\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n );\n};\n\nexport const RoomShell = Object.assign(RoomShellBase, {\n Sidebar: RoomSidebar,\n SidebarButton: SidebarButton,\n LayoutComposer: LayoutComposer,\n LoadingProgress: LoadingProgress,\n});\n"]}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { getVisibleMosaicLayoutPanels } from '@sqlrooms/layout';
3
3
  import { Button, cn, Tooltip, TooltipContent, TooltipTrigger, } from '@sqlrooms/ui';
4
4
  import { useMemo } from 'react';
5
- import { useBaseRoomShellStore } from './RoomShellStore';
5
+ import { useBaseRoomShellStore } from './RoomShellSlice';
6
6
  const SidebarButton = ({ className, title, isSelected, isDisabled = false, icon: Icon, onClick, }) => {
7
7
  return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: cn('h-10 w-10 rounded-none', isSelected ? 'bg-secondary' : 'hover:bg-secondary/50',
8
8
  // isDisabled && 'opacity-50 cursor-not-allowed',
@@ -10,7 +10,7 @@ const SidebarButton = ({ className, title, isSelected, isDisabled = false, icon:
10
10
  };
11
11
  const RoomShellSidebarButton = ({ roomPanelType, }) => {
12
12
  const initialized = useBaseRoomShellStore((state) => state.room.initialized);
13
- const layout = useBaseRoomShellStore((state) => state.config.layout);
13
+ const layout = useBaseRoomShellStore((state) => state.layout.config);
14
14
  const panels = useBaseRoomShellStore((state) => state.layout.panels);
15
15
  const visibleRoomPanels = useMemo(() => getVisibleMosaicLayoutPanels(layout?.nodes), [layout]);
16
16
  const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShellSidebarButtons.js","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":"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","sourcesContent":["import {getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport React, {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from './RoomShellStore';\n\nconst SidebarButton: FC<{\n className?: string;\n title: string;\n isSelected: boolean;\n isDisabled?: boolean;\n icon: React.ComponentType<{className?: string}>;\n onClick: () => void;\n}> = ({\n className,\n title,\n isSelected,\n isDisabled = false,\n icon: Icon,\n onClick,\n}) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'h-10 w-10 rounded-none',\n isSelected ? 'bg-secondary' : 'hover:bg-secondary/50',\n // isDisabled && 'opacity-50 cursor-not-allowed',\n className,\n )}\n disabled={isDisabled}\n onClick={onClick}\n >\n {Icon ? <Icon className=\"h-5 w-5\" /> : title}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <p>{title}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst RoomShellSidebarButton: FC<{roomPanelType: string}> = ({\n roomPanelType,\n}) => {\n const initialized = useBaseRoomShellStore((state) => state.room.initialized);\n const layout = useBaseRoomShellStore((state) => state.config.layout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const {icon: Icon, title} = panels[roomPanelType] ?? {};\n\n return (\n <SidebarButton\n key={roomPanelType}\n title={title ?? ''}\n isSelected={visibleRoomPanels.includes(roomPanelType)}\n isDisabled={!initialized}\n icon={Icon ?? (() => null)}\n onClick={() => togglePanel(roomPanelType)}\n />\n );\n};\n\nconst RoomShellSidebarButtons: FC<{className?: string}> = ({className}) => {\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n\n return (\n <div className={cn('flex h-full grow flex-col', className)}>\n <div className=\"flex flex-col gap-2\">\n {panels\n ? Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))\n : null}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex flex-col gap-2\">\n {Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar-bottom')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))}\n </div>\n </div>\n );\n};\n\nexport {RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton};\n"]}
1
+ {"version":3,"file":"RoomShellSidebarButtons.js","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":"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","sourcesContent":["import {getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport React, {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from './RoomShellSlice';\n\nconst SidebarButton: FC<{\n className?: string;\n title: string;\n isSelected: boolean;\n isDisabled?: boolean;\n icon: React.ComponentType<{className?: string}>;\n onClick: () => void;\n}> = ({\n className,\n title,\n isSelected,\n isDisabled = false,\n icon: Icon,\n onClick,\n}) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'h-10 w-10 rounded-none',\n isSelected ? 'bg-secondary' : 'hover:bg-secondary/50',\n // isDisabled && 'opacity-50 cursor-not-allowed',\n className,\n )}\n disabled={isDisabled}\n onClick={onClick}\n >\n {Icon ? <Icon className=\"h-5 w-5\" /> : title}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <p>{title}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst RoomShellSidebarButton: FC<{roomPanelType: string}> = ({\n roomPanelType,\n}) => {\n const initialized = useBaseRoomShellStore((state) => state.room.initialized);\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const {icon: Icon, title} = panels[roomPanelType] ?? {};\n\n return (\n <SidebarButton\n key={roomPanelType}\n title={title ?? ''}\n isSelected={visibleRoomPanels.includes(roomPanelType)}\n isDisabled={!initialized}\n icon={Icon ?? (() => null)}\n onClick={() => togglePanel(roomPanelType)}\n />\n );\n};\n\nconst RoomShellSidebarButtons: FC<{className?: string}> = ({className}) => {\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n\n return (\n <div className={cn('flex h-full grow flex-col', className)}>\n <div className=\"flex flex-col gap-2\">\n {panels\n ? Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))\n : null}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex flex-col gap-2\">\n {Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar-bottom')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))}\n </div>\n </div>\n );\n};\n\nexport {RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton};\n"]}
@@ -0,0 +1,107 @@
1
+ import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
2
+ import { CreateLayoutSliceProps, LayoutSliceState } from '@sqlrooms/layout';
3
+ import { BaseRoomConfig, DataSource, FileDataSource, LayoutConfig } from '@sqlrooms/room-config';
4
+ import { BaseRoomStoreState, CreateBaseRoomSliceProps } from '@sqlrooms/room-store';
5
+ import { ProgressInfo } from '@sqlrooms/utils';
6
+ import { ReactNode } from 'react';
7
+ import { StateCreator, StoreApi } from 'zustand';
8
+ import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
9
+ export type RoomShellSliceConfig = BaseRoomConfig;
10
+ export type RoomShellStore = StoreApi<RoomShellSliceState>;
11
+ export type TaskProgress = {
12
+ progress?: number | undefined;
13
+ message: string;
14
+ };
15
+ export type RoomShellSliceState = {
16
+ initialize?: () => Promise<void>;
17
+ room: BaseRoomStoreState['room'] & {
18
+ config: RoomShellSliceConfig;
19
+ tasksProgress: Record<string, TaskProgress>;
20
+ setConfig: (config: RoomShellSliceConfig) => void;
21
+ setTaskProgress: (id: string, taskProgress: TaskProgress | undefined) => void;
22
+ getLoadingProgress: () => TaskProgress | undefined;
23
+ roomFiles: RoomFileInfo[];
24
+ roomFilesProgress: {
25
+ [pathname: string]: RoomFileState;
26
+ };
27
+ isDataAvailable: boolean;
28
+ dataSourceStates: {
29
+ [tableName: string]: DataSourceState;
30
+ };
31
+ /**
32
+ * Load a file data source. A fileDataSourceLoader implementation can be passed to
33
+ * createRoomShellSlice to specify how file data sources should be loaded.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * ...createRoomShellSlice({
38
+ * config: {
39
+ * dataSources: [
40
+ * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },
41
+ * ],
42
+ * },
43
+ * room: {
44
+ * fileDataSourceLoader: async ({fileName}, onProgress) =>
45
+ * await downloadFile(`https://some.url/${fileName}`, {onProgress}),
46
+ * },
47
+ * })(set, get, store)
48
+ * ```
49
+ *
50
+ * @param fileName - The name of the file to load.
51
+ * @param onProgress - A callback to report the progress of the download.
52
+ * @returns The loaded file.
53
+ */
54
+ fileDataSourceLoader?: ({ fileName }: FileDataSource, onProgress: (progress: ProgressInfo) => void) => Promise<Uint8Array | File>;
55
+ CustomErrorBoundary: React.ComponentType<{
56
+ onRetry?: () => void;
57
+ children?: ReactNode;
58
+ }>;
59
+ setRoomTitle(title: string): void;
60
+ setDescription(description: string): void;
61
+ /**
62
+ * Add or update a SQL query data source.
63
+ * @param tableName - The name of the table to create or update.
64
+ * @param query - The SQL query to execute.
65
+ * @param oldTableName - The name of the table to replace (optional).
66
+ */
67
+ addOrUpdateSqlQueryDataSource(tableName: string, query: string, oldTableName?: string): Promise<void>;
68
+ areDatasetsReady(): boolean;
69
+ addRoomFile(file: File | string, tableName?: string, loadFileOptions?: LoadFileOptions): Promise<DataTable | undefined>;
70
+ /**
71
+ * @deprecated Use removeDataSource or removeRoomFile instead
72
+ */
73
+ removeSqlQueryDataSource(tableName: string): Promise<void>;
74
+ /**
75
+ * Removes a data source from the room by tableName.
76
+ * @param tableName - The name of the table of the data source to remove.
77
+ */
78
+ removeDataSource(tableName: string): Promise<void>;
79
+ /**
80
+ * Removes a file data source from the room by pathname.
81
+ * @param pathname - The pathname of the file to remove.
82
+ */
83
+ removeRoomFile(pathname: string): Promise<void>;
84
+ setRoomFiles(info: RoomFileInfo[]): void;
85
+ setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
86
+ addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
87
+ };
88
+ } & DuckDbSliceState & LayoutSliceState;
89
+ /**
90
+ * This type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.
91
+ */
92
+ type CreateRoomShellSliceProps = CreateBaseRoomSliceProps & {
93
+ connector?: DuckDbConnector;
94
+ config?: Partial<RoomShellSliceConfig & {
95
+ /** @deprecated Use layout.config instead */
96
+ layout?: LayoutConfig;
97
+ }>;
98
+ layout?: CreateLayoutSliceProps;
99
+ fileDataSourceLoader?: RoomShellSliceState['room']['fileDataSourceLoader'];
100
+ CustomErrorBoundary?: RoomShellSliceState['room']['CustomErrorBoundary'];
101
+ /** @deprecated Use direct props instead e.g. layout.panels */
102
+ room?: Partial<Pick<LayoutSliceState['layout'], 'panels'>>;
103
+ };
104
+ export declare function createRoomShellSlice(props: CreateRoomShellSliceProps): StateCreator<RoomShellSliceState>;
105
+ export declare function useBaseRoomShellStore<RS extends RoomShellSliceState, T>(selector: (state: RS) => T): T;
106
+ export {};
107
+ //# sourceMappingURL=RoomShellSlice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomShellSlice.d.ts","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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"}
@@ -1,48 +1,49 @@
1
- import { createDefaultDuckDbConfig, createDuckDbSlice, } from '@sqlrooms/duckdb';
2
- import { createDefaultLayoutConfig, createLayoutSlice, } from '@sqlrooms/layout';
3
- import { DataSourceTypes, isFileDataSource, isUrlDataSource, isSqlQueryDataSource, } from '@sqlrooms/room-config';
4
- import { createRoomSlice, isRoomSliceWithInitialize, useBaseRoomStore, } from '@sqlrooms/room-store';
1
+ import { createDuckDbSlice, } from '@sqlrooms/duckdb';
2
+ import { createLayoutSlice, } from '@sqlrooms/layout';
3
+ import { DataSourceTypes, createDefaultBaseRoomConfig, isFileDataSource, isSqlQueryDataSource, isUrlDataSource, } from '@sqlrooms/room-config';
4
+ import { createBaseRoomSlice, isRoomSliceWithInitialize, useBaseRoomStore, } from '@sqlrooms/room-store';
5
5
  import { ErrorBoundary } from '@sqlrooms/ui';
6
6
  import { convertToUniqueColumnOrTableName, convertToValidColumnOrTableName, downloadFile, } from '@sqlrooms/utils';
7
- import { castDraft, produce } from 'immer';
8
- import { createDefaultBaseRoomConfig } from '@sqlrooms/room-config';
7
+ import { produce } from 'immer';
9
8
  import { DataSourceStatus, } from './types';
10
- const INITIAL_BASE_ROOM_CONFIG = {
11
- ...createDefaultBaseRoomConfig(),
12
- ...createDefaultDuckDbConfig(),
13
- ...createDefaultLayoutConfig(),
14
- };
15
9
  const DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';
16
10
  const INIT_DB_TASK = 'init-db';
17
11
  const INIT_ROOM_TASK = 'init-room';
18
12
  export function createRoomShellSlice(props) {
19
13
  const slice = (set, get, store) => {
20
- const { connector, config: configProps, room: roomStateProps, ...restState } = props;
21
- const initialConfig = {
22
- ...INITIAL_BASE_ROOM_CONFIG,
23
- ...configProps,
14
+ const { connector, config: configProps, layout: layoutProps, room: deprecatedRoomProps, fileDataSourceLoader, CustomErrorBoundary = ErrorBoundary, captureException = (exception) => console.error(exception), ...restProps } = props;
15
+ const createLayoutProps = {
16
+ ...layoutProps,
17
+ config: layoutProps?.config ?? configProps?.layout,
18
+ panels: layoutProps?.panels ?? deprecatedRoomProps?.panels,
24
19
  };
25
- const initialRoomState = {
26
- CustomErrorBoundary: ErrorBoundary,
27
- roomFiles: [],
28
- roomFilesProgress: {},
29
- isDataAvailable: false,
30
- dataSourceStates: {},
31
- ...roomStateProps,
32
- };
33
- const roomSliceState = createRoomSlice({
34
- config: initialConfig,
35
- room: initialRoomState,
20
+ const roomSliceState = createBaseRoomSlice({
21
+ captureException,
36
22
  })(set, get, store);
37
- const roomState = {
23
+ const sliceState = {
38
24
  ...roomSliceState,
39
25
  ...createDuckDbSlice({ connector })(set, get, store),
40
- ...createLayoutSlice({ panels: roomStateProps.panels })(set, get, store),
26
+ ...createLayoutSlice(createLayoutProps)(set, get, store),
41
27
  room: {
42
- ...initialRoomState,
43
28
  ...roomSliceState.room,
29
+ // @ts-ignore TODO: fix this
30
+ config: {
31
+ ...createDefaultBaseRoomConfig(),
32
+ ...configProps,
33
+ },
34
+ CustomErrorBoundary,
35
+ roomFiles: [],
36
+ roomFilesProgress: {},
37
+ isDataAvailable: false,
38
+ dataSourceStates: {},
39
+ tasksProgress: {},
40
+ fileDataSourceLoader,
41
+ setConfig: (config) => {
42
+ set((state) => produce(state, (draft) => {
43
+ draft.room.config = config;
44
+ }));
45
+ },
44
46
  async initialize() {
45
- await roomSliceState.room.initialize();
46
47
  const { setTaskProgress } = get().room;
47
48
  setTaskProgress(INIT_DB_TASK, {
48
49
  message: 'Initializing database…',
@@ -71,26 +72,35 @@ export function createRoomShellSlice(props) {
71
72
  }
72
73
  setTaskProgress(INIT_ROOM_TASK, undefined);
73
74
  },
74
- setRoomConfig: (config) => set((state) => produce(state, (draft) => {
75
- draft.config = castDraft(config);
76
- })),
77
- setLastSavedConfig: (config) => set((state) => produce(state, (draft) => {
78
- draft.room.lastSavedConfig = castDraft(config);
79
- })),
80
- hasUnsavedChanges: () => {
81
- const { lastSavedConfig } = get().room;
82
- const { config } = get();
83
- return config !== lastSavedConfig;
75
+ /** Returns the progress of the last task */
76
+ getLoadingProgress() {
77
+ const { tasksProgress } = get().room;
78
+ const keys = Object.keys(tasksProgress);
79
+ const lastKey = keys[keys.length - 1];
80
+ if (lastKey) {
81
+ return tasksProgress[lastKey];
82
+ }
83
+ return undefined;
84
+ },
85
+ setTaskProgress(id, taskProgress) {
86
+ set((state) => produce(state, (draft) => {
87
+ if (taskProgress) {
88
+ draft.room.tasksProgress[id] = taskProgress;
89
+ }
90
+ else {
91
+ delete draft.room.tasksProgress[id];
92
+ }
93
+ }));
84
94
  },
85
95
  setRoomTitle: (title) => set((state) => produce(state, (draft) => {
86
- draft.config.title = title;
96
+ draft.room.config.title = title;
87
97
  })),
88
98
  setDescription: (description) => set((state) => produce(state, (draft) => {
89
- draft.config.description = description;
99
+ draft.room.config.description = description;
90
100
  })),
91
101
  addDataSource: async (dataSource, status = DataSourceStatus.PENDING) => {
92
102
  set((state) => produce(state, (draft) => {
93
- const dataSources = draft.config.dataSources;
103
+ const dataSources = draft.room.config.dataSources;
94
104
  const tableName = dataSource.tableName;
95
105
  const index = dataSources.findIndex((d) => d.tableName === tableName);
96
106
  if (index >= 0) {
@@ -118,13 +128,14 @@ export function createRoomShellSlice(props) {
118
128
  tableName: newTableName,
119
129
  };
120
130
  if (oldTableName) {
121
- draft.config.dataSources = draft.config.dataSources.map((dataSource) => dataSource.tableName === oldTableName
122
- ? newDataSource
123
- : dataSource);
131
+ draft.room.config.dataSources =
132
+ draft.room.config.dataSources.map((dataSource) => dataSource.tableName === oldTableName
133
+ ? newDataSource
134
+ : dataSource);
124
135
  delete draft.room.dataSourceStates[oldTableName];
125
136
  }
126
137
  else {
127
- draft.config.dataSources.push(newDataSource);
138
+ draft.room.config.dataSources.push(newDataSource);
128
139
  }
129
140
  draft.room.dataSourceStates[newTableName] = {
130
141
  status: DataSourceStatus.READY,
@@ -170,10 +181,11 @@ export function createRoomShellSlice(props) {
170
181
  },
171
182
  removeDataSource: async (tableName) => {
172
183
  const { db } = get();
173
- const dataSource = get().config.dataSources.find((d) => d.tableName === tableName);
184
+ const dataSource = get().room.config.dataSources.find((d) => d.tableName === tableName);
174
185
  if (dataSource) {
175
186
  set((state) => produce(state, (draft) => {
176
- draft.config.dataSources = draft.config.dataSources.filter((d) => d.tableName !== tableName);
187
+ draft.room.config.dataSources =
188
+ draft.room.config.dataSources.filter((d) => d.tableName !== tableName);
177
189
  if (dataSource && isFileDataSource(dataSource)) {
178
190
  draft.room.roomFiles = draft.room.roomFiles.filter((f) => f.pathname !== dataSource.fileName);
179
191
  }
@@ -184,7 +196,7 @@ export function createRoomShellSlice(props) {
184
196
  }
185
197
  },
186
198
  removeRoomFile: async (pathname) => {
187
- const dataSource = get().config.dataSources.find((d) => isFileDataSource(d) && d.fileName === pathname);
199
+ const dataSource = get().room.config.dataSources.find((d) => isFileDataSource(d) && d.fileName === pathname);
188
200
  if (dataSource) {
189
201
  await get().room.removeDataSource(dataSource.tableName);
190
202
  }
@@ -202,13 +214,12 @@ export function createRoomShellSlice(props) {
202
214
  }));
203
215
  },
204
216
  areDatasetsReady: () => {
205
- const { dataSourceStates } = get().room;
206
- const { config } = get();
207
- const dataSources = config.dataSources;
217
+ const dataSourceStates = get().room.dataSourceStates;
218
+ const dataSources = get().room.config.dataSources;
208
219
  return dataSources.every((ds) => dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY);
209
220
  },
210
221
  },
211
- ...restState,
222
+ ...restProps,
212
223
  };
213
224
  // If the tables have changed, update the data sources
214
225
  store.subscribe((state, prevState) => {
@@ -216,10 +227,11 @@ export function createRoomShellSlice(props) {
216
227
  updateReadyDataSources();
217
228
  }
218
229
  });
230
+ return sliceState;
219
231
  async function updateReadyDataSources() {
220
232
  const { tables } = get().db;
221
233
  const { dataSourceStates } = get().room;
222
- const { config } = get();
234
+ const { config } = get().room;
223
235
  const { dataSources } = config;
224
236
  set((state) => produce(state, (draft) => {
225
237
  for (const ds of dataSources) {
@@ -243,7 +255,7 @@ export function createRoomShellSlice(props) {
243
255
  }
244
256
  async function maybeDownloadDataSources() {
245
257
  const { roomFilesProgress, dataSourceStates } = get().room;
246
- const { dataSources } = get().config;
258
+ const { dataSources } = get().room.config;
247
259
  const pendingDataSources = dataSources.filter((ds) => !dataSourceStates[ds.tableName] ||
248
260
  dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING);
249
261
  const filesToDownload = pendingDataSources.filter((ds) => {
@@ -262,7 +274,7 @@ export function createRoomShellSlice(props) {
262
274
  if (queriesToRun.length > 0) {
263
275
  await runDataSourceQueries(queriesToRun);
264
276
  }
265
- if (get().config.dataSources.length > 0) {
277
+ if (get().room.config.dataSources.length > 0) {
266
278
  set((state) => produce(state, (draft) => {
267
279
  draft.room.isDataAvailable = true;
268
280
  }));
@@ -394,14 +406,10 @@ export function createRoomShellSlice(props) {
394
406
  message: 'Downloading data…',
395
407
  });
396
408
  }
397
- return roomState;
398
409
  };
399
410
  return slice;
400
411
  }
401
412
  export function useBaseRoomShellStore(selector) {
402
413
  return useBaseRoomStore(selector);
403
414
  }
404
- export function createSlice(sliceCreator) {
405
- return (set, get, store) => sliceCreator(set, get, store);
406
- }
407
- //# sourceMappingURL=RoomShellStore.js.map
415
+ //# sourceMappingURL=RoomShellSlice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomShellSlice.js","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceState,\n LoadFileOptions,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n CreateLayoutSliceProps,\n LayoutSliceState,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n LayoutConfig,\n SqlQueryDataSource,\n UrlDataSource,\n createDefaultBaseRoomConfig,\n isFileDataSource,\n isSqlQueryDataSource,\n isUrlDataSource,\n} from '@sqlrooms/room-config';\nimport {\n BaseRoomStoreState,\n CreateBaseRoomSliceProps,\n createBaseRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellSliceConfig = BaseRoomConfig;\n\nexport type RoomShellStore = StoreApi<RoomShellSliceState>;\n\nexport type TaskProgress = {\n progress?: number | undefined;\n message: string;\n};\n\nexport type RoomShellSliceState = {\n initialize?: () => Promise<void>;\n room: BaseRoomStoreState['room'] & {\n config: RoomShellSliceConfig;\n tasksProgress: Record<string, TaskProgress>;\n\n setConfig: (config: RoomShellSliceConfig) => void;\n setTaskProgress: (\n id: string,\n taskProgress: TaskProgress | undefined,\n ) => void;\n getLoadingProgress: () => TaskProgress | undefined;\n\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n /**\n * Load a file data source. A fileDataSourceLoader implementation can be passed to\n * createRoomShellSlice to specify how file data sources should be loaded.\n *\n * @example\n * ```ts\n * ...createRoomShellSlice({\n * config: {\n * dataSources: [\n * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },\n * ],\n * },\n * room: {\n * fileDataSourceLoader: async ({fileName}, onProgress) =>\n * await downloadFile(`https://some.url/${fileName}`, {onProgress}),\n * },\n * })(set, get, store)\n * ```\n *\n * @param fileName - The name of the file to load.\n * @param onProgress - A callback to report the progress of the download.\n * @returns The loaded file.\n */\n fileDataSourceLoader?: (\n {fileName}: FileDataSource,\n onProgress: (progress: ProgressInfo) => void,\n ) => Promise<Uint8Array | File>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<void>;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n} & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype CreateRoomShellSliceProps = CreateBaseRoomSliceProps & {\n connector?: DuckDbConnector;\n config?: Partial<\n RoomShellSliceConfig & {\n /** @deprecated Use layout.config instead */\n layout?: LayoutConfig;\n }\n >;\n layout?: CreateLayoutSliceProps;\n fileDataSourceLoader?: RoomShellSliceState['room']['fileDataSourceLoader'];\n CustomErrorBoundary?: RoomShellSliceState['room']['CustomErrorBoundary'];\n /** @deprecated Use direct props instead e.g. layout.panels */\n room?: Partial<Pick<LayoutSliceState['layout'], 'panels'>>;\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice(\n props: CreateRoomShellSliceProps,\n): StateCreator<RoomShellSliceState> {\n const slice: StateCreator<RoomShellSliceState> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n layout: layoutProps,\n room: deprecatedRoomProps,\n fileDataSourceLoader,\n CustomErrorBoundary = ErrorBoundary,\n captureException = (exception) => console.error(exception),\n ...restProps\n } = props;\n\n const createLayoutProps: CreateLayoutSliceProps = {\n ...layoutProps,\n config: layoutProps?.config ?? configProps?.layout,\n panels: layoutProps?.panels ?? deprecatedRoomProps?.panels,\n };\n const roomSliceState = createBaseRoomSlice({\n captureException,\n })(set, get, store);\n\n const sliceState: RoomShellSliceState = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice(createLayoutProps)(set, get, store),\n room: {\n ...roomSliceState.room,\n // @ts-ignore TODO: fix this\n config: {\n ...createDefaultBaseRoomConfig(),\n ...configProps,\n },\n CustomErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n tasksProgress: {},\n fileDataSourceLoader,\n\n setConfig: (config) => {\n set((state) =>\n produce(state, (draft) => {\n draft.room.config = config;\n }),\n );\n },\n\n async initialize() {\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n /** Returns the progress of the last task */\n getLoadingProgress() {\n const {tasksProgress} = get().room;\n const keys = Object.keys(tasksProgress);\n const lastKey = keys[keys.length - 1];\n if (lastKey) {\n return tasksProgress[lastKey];\n }\n return undefined;\n },\n\n setTaskProgress(id, taskProgress) {\n set((state) =>\n produce(state, (draft) => {\n if (taskProgress) {\n draft.room.tasksProgress[id] = taskProgress;\n } else {\n delete draft.room.tasksProgress[id];\n }\n }),\n );\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.room.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.room.config.dataSources =\n draft.room.config.dataSources.map((dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.room.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().room.config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.dataSources =\n draft.room.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource && isFileDataSource(dataSource)) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().room.config.dataSources.find(\n (d) => isFileDataSource(d) && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\n }\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const dataSourceStates = get().room.dataSourceStates;\n const dataSources = get().room.config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restProps,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n return sliceState;\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get().room;\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().room.config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n if (isFileDataSource(ds)) {\n return !roomFilesProgress[ds.fileName];\n }\n if (isUrlDataSource(ds)) {\n return !roomFilesProgress[ds.url];\n }\n return false;\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(isSqlQueryDataSource);\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().room.config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n const onProgress = (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n };\n try {\n let downloadedFile: Uint8Array | File;\n if (isFileDataSource(ds)) {\n const {fileDataSourceLoader} = get().room;\n if (!fileDataSourceLoader) {\n throw new Error('fileDataSourceLoader is not defined');\n }\n downloadedFile = await fileDataSourceLoader(ds, onProgress);\n } else if (isUrlDataSource(ds)) {\n const url = ds.url;\n downloadedFile = await downloadFile(url, {\n method: ds.httpMethod,\n headers: ds.headers,\n onProgress,\n });\n } else {\n // This should never happen as filesToDownload only contains FileDataSource | UrlDataSource\n throw new Error('Unsupported data source type');\n }\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n downloadedFile instanceof File\n ? downloadedFile\n : new File([new Uint8Array(downloadedFile)], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<RS extends RoomShellSliceState, T>(\n selector: (state: RS) => T,\n): T {\n return useBaseRoomStore<RS, T>(selector as (state: RS) => T);\n}\n"]}
@@ -3,7 +3,7 @@ import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMe
3
3
  import { formatBytes, splitFilePath } from '@sqlrooms/utils';
4
4
  import { CloudDownloadIcon, CloudIcon, CloudUploadIcon, EllipsisIcon, FileDownIcon, FileTextIcon, XIcon, } from 'lucide-react';
5
5
  import { useCallback } from 'react';
6
- import { useBaseRoomShellStore } from '../RoomShellStore';
6
+ import { useBaseRoomShellStore } from '../RoomShellSlice';
7
7
  const FileDataSourceCard = (props) => {
8
8
  const { isReadOnly, fileInfo, fileState } = props;
9
9
  const { pathname, size } = fileInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"FileDataSourceCard.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourceCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,WAAW,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,KAAK,GACN,MAAM,cAAc,CAAC;AACtB,OAAO,EAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,kBAAkB,GAInB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAC,GAAG,KAAK,CAAC;IAChD,MAAM,EAAC,QAAQ,EAAE,IAAI,EAAC,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAC,QAAQ,EAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CACrC,CAAC;IACF,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAExC,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,iDAAiD,aAC9D,cAAK,SAAS,EAAC,oBAAoB,YACjC,KAAC,YAAY,IAAC,SAAS,EAAC,UAAU,GAAG,GACjC,EACN,cAAK,SAAS,EAAC,wDAAwD,YACrE,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,eAAM,SAAS,EAAC,qBAAqB,YAAE,QAAQ,GAAQ,GACxC,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,YAC3B,cAAK,SAAS,EAAC,yCAAyC,YACrD,QAAQ,GACL,GACS,IACT,GACN,EACN,cAAK,SAAS,EAAC,WAAW,YACvB,CAAC,UAAU,CAAC,CAAC,CAAC,CACb,MAAC,YAAY,eACX,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,KAAC,MAAM,IACL,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,EACf,SAAS,EAAC,+BAA+B,YAEzC,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,GAC7B,GACW,EACtB,MAAC,mBAAmB,IAAC,KAAK,EAAC,KAAK,aAC9B,MAAC,gBAAgB,IAAC,OAAO,EAAE,oBAAoB,aAC7C,KAAC,KAAK,IAAC,SAAS,EAAC,cAAc,GAAG,mBAEjB,EACnB,MAAC,gBAAgB,IAAC,QAAQ,mBACxB,KAAC,YAAY,IAAC,SAAS,EAAC,cAAc,GAAG,qBAExB,IACC,IACT,CAChB,CAAC,CAAC,CAAC,IAAI,GACJ,IACF,EACN,eAAK,SAAS,EAAC,kCAAkC,aAC9C,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAC/B,cAAK,SAAS,EAAC,+DAA+D,YAC3E,SAAS,CAAC,OAAO,GACd,CACP,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU;wBAClC,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CACjC,cAAK,SAAS,EAAC,iDAAiD,YAC9D,cACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;gCACL,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG;6BACpD,GACD,GACE,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,WAAW,YACvB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CACpB,eAAM,SAAS,EAAC,uDAAuD,YACpE,WAAW,CAAC,IAAI,CAAC,GACb,CACR,CAAC,CAAC,CAAC,IAAI,GACJ,EACN,cACE,SAAS,EAAC,gBAAgB,EAC1B,KAAK,EACH,SAAS,EAAE,MAAM,KAAK,MAAM;4BAC1B,CAAC,CAAC,aAAa;4BACf,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU;gCAChC,CAAC,CAAC,mBAAmB;gCACrB,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,QAAQ;oCAC9B,CAAC,CAAC,iBAAiB;oCACnB,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO;wCAC7B,CAAC,CAAC,wBAAwB,SAAS,CAAC,OAAO,EAAE;wCAC7C,CAAC,CAAC,iBAAiB,YAG5B,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAC9B,KAAC,SAAS,IAAC,SAAS,EAAC,yBAAyB,GAAG,CAClD,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CACrC,KAAC,iBAAiB,IAAC,SAAS,EAAC,0BAA0B,GAAG,CAC3D,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CACnC,KAAC,eAAe,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACzD,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAClC,KAAC,SAAS,IAAC,SAAS,EAAC,2BAA2B,GAAG,CACpD,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,SAAS,EAAC,0BAA0B,GAAG,CACnD,GACG,IACF,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,kBAAkB,EAAC,CAAC","sourcesContent":["import {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {formatBytes, splitFilePath} from '@sqlrooms/utils';\nimport {\n CloudDownloadIcon,\n CloudIcon,\n CloudUploadIcon,\n EllipsisIcon,\n FileDownIcon,\n FileTextIcon,\n XIcon,\n} from 'lucide-react';\nimport {FC, useCallback} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\nimport {RoomFileInfo, RoomFileState} from '../types';\nconst FileDataSourceCard: FC<{\n isReadOnly?: boolean;\n fileInfo: RoomFileInfo;\n fileState?: RoomFileState;\n}> = (props) => {\n const {isReadOnly, fileInfo, fileState} = props;\n const {pathname, size} = fileInfo;\n const {filename} = splitFilePath(pathname);\n const removeRoomFile = useBaseRoomShellStore(\n (state) => state.room.removeRoomFile,\n );\n const handleRemoveFromRoom = useCallback(() => {\n removeRoomFile(fileInfo.pathname);\n }, [fileInfo.pathname, removeRoomFile]);\n\n return (\n <div className=\"flex flex-col gap-1 p-2\">\n <div className=\"flex cursor-pointer flex-row items-center gap-1\">\n <div className=\"w-[15px] flex-none\">\n <FileTextIcon className=\"w-[15px]\" />\n </div>\n <div className=\"flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"break-words text-xs\">{filename}</span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <pre className=\"w-[300px] text-wrap break-words text-xs\">\n {pathname}\n </pre>\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex-none\">\n {!isReadOnly ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground h-6 w-6\"\n >\n <EllipsisIcon className=\"h-5 w-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={handleRemoveFromRoom}>\n <XIcon className=\"mr-2 h-4 w-4\" />\n Remove file\n </DropdownMenuItem>\n <DropdownMenuItem disabled>\n <FileDownIcon className=\"mr-2 h-4 w-4\" />\n Download file\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-row items-center gap-1\">\n {fileState?.status === 'error' ? (\n <div className=\"bg-destructive/15 text-destructive flex-1 rounded p-1 text-xs\">\n {fileState.message}\n </div>\n ) : fileState?.status === 'download' ||\n fileState?.status === 'upload' ? (\n <div className=\"bg-secondary h-1 w-full overflow-hidden rounded\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{\n width: `${(fileState.progress?.ratio ?? 0) * 100}%`,\n }}\n />\n </div>\n ) : null}\n <div className=\"flex-none\">\n {size !== undefined ? (\n <span className=\"text-muted-foreground min-w-[70px] text-right text-xs\">\n {formatBytes(size)}\n </span>\n ) : null}\n </div>\n <div\n className=\"cursor-pointer\"\n title={\n fileState?.status === 'done'\n ? 'File synced'\n : fileState?.status === 'download'\n ? 'Downloading file…'\n : fileState?.status === 'upload'\n ? 'Uploading file…'\n : fileState?.status === 'error'\n ? `Failed to sync file: ${fileState.message}`\n : 'File not synced'\n }\n >\n {fileState?.status === 'done' ? (\n <CloudIcon className=\"w-[15px] text-green-400\" />\n ) : fileState?.status === 'download' ? (\n <CloudDownloadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'upload' ? (\n <CloudUploadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'error' ? (\n <CloudIcon className=\"text-destructive w-[15px]\" />\n ) : (\n <CloudIcon className=\"w-[15px] text-orange-400\" />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport {FileDataSourceCard};\n"]}
1
+ {"version":3,"file":"FileDataSourceCard.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {formatBytes, splitFilePath} from '@sqlrooms/utils';\nimport {\n CloudDownloadIcon,\n CloudIcon,\n CloudUploadIcon,\n EllipsisIcon,\n FileDownIcon,\n FileTextIcon,\n XIcon,\n} from 'lucide-react';\nimport {FC, useCallback} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {RoomFileInfo, RoomFileState} from '../types';\nconst FileDataSourceCard: FC<{\n isReadOnly?: boolean;\n fileInfo: RoomFileInfo;\n fileState?: RoomFileState;\n}> = (props) => {\n const {isReadOnly, fileInfo, fileState} = props;\n const {pathname, size} = fileInfo;\n const {filename} = splitFilePath(pathname);\n const removeRoomFile = useBaseRoomShellStore(\n (state) => state.room.removeRoomFile,\n );\n const handleRemoveFromRoom = useCallback(() => {\n removeRoomFile(fileInfo.pathname);\n }, [fileInfo.pathname, removeRoomFile]);\n\n return (\n <div className=\"flex flex-col gap-1 p-2\">\n <div className=\"flex cursor-pointer flex-row items-center gap-1\">\n <div className=\"w-[15px] flex-none\">\n <FileTextIcon className=\"w-[15px]\" />\n </div>\n <div className=\"flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"break-words text-xs\">{filename}</span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <pre className=\"w-[300px] text-wrap break-words text-xs\">\n {pathname}\n </pre>\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex-none\">\n {!isReadOnly ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground h-6 w-6\"\n >\n <EllipsisIcon className=\"h-5 w-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={handleRemoveFromRoom}>\n <XIcon className=\"mr-2 h-4 w-4\" />\n Remove file\n </DropdownMenuItem>\n <DropdownMenuItem disabled>\n <FileDownIcon className=\"mr-2 h-4 w-4\" />\n Download file\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-row items-center gap-1\">\n {fileState?.status === 'error' ? (\n <div className=\"bg-destructive/15 text-destructive flex-1 rounded p-1 text-xs\">\n {fileState.message}\n </div>\n ) : fileState?.status === 'download' ||\n fileState?.status === 'upload' ? (\n <div className=\"bg-secondary h-1 w-full overflow-hidden rounded\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{\n width: `${(fileState.progress?.ratio ?? 0) * 100}%`,\n }}\n />\n </div>\n ) : null}\n <div className=\"flex-none\">\n {size !== undefined ? (\n <span className=\"text-muted-foreground min-w-[70px] text-right text-xs\">\n {formatBytes(size)}\n </span>\n ) : null}\n </div>\n <div\n className=\"cursor-pointer\"\n title={\n fileState?.status === 'done'\n ? 'File synced'\n : fileState?.status === 'download'\n ? 'Downloading file…'\n : fileState?.status === 'upload'\n ? 'Uploading file…'\n : fileState?.status === 'error'\n ? `Failed to sync file: ${fileState.message}`\n : 'File not synced'\n }\n >\n {fileState?.status === 'done' ? (\n <CloudIcon className=\"w-[15px] text-green-400\" />\n ) : fileState?.status === 'download' ? (\n <CloudDownloadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'upload' ? (\n <CloudUploadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'error' ? (\n <CloudIcon className=\"text-destructive w-[15px]\" />\n ) : (\n <CloudIcon className=\"w-[15px] text-orange-400\" />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport {FileDataSourceCard};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { FileDataSourceCard } from './FileDataSourceCard';
3
- import { useBaseRoomShellStore } from '../RoomShellStore';
3
+ import { useBaseRoomShellStore } from '../RoomShellSlice';
4
4
  const FileDataSourcesPanel = ({ isReadOnly }) => {
5
5
  const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);
6
6
  const roomFilesProgress = useBaseRoomShellStore((state) => state.room.roomFilesProgress);
@@ -1 +1 @@
1
- {"version":3,"file":"FileDataSourcesPanel.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourcesPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,oBAAoB,GAA+B,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;IACxE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CACxC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,kBAAkB,IAEjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAH1C,CAAC,CAIN,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,oBAAoB,EAAC,CAAC","sourcesContent":["import {FC} from 'react';\nimport {FileDataSourceCard} from './FileDataSourceCard';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\n\nconst FileDataSourcesPanel: FC<{isReadOnly?: boolean}> = ({isReadOnly}) => {\n const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);\n const roomFilesProgress = useBaseRoomShellStore(\n (state) => state.room.roomFilesProgress,\n );\n\n return (\n <div className=\"flex flex-grow flex-col overflow-auto\">\n {roomFiles.map((fileInfo, i) => (\n <FileDataSourceCard\n key={i}\n isReadOnly={isReadOnly}\n fileInfo={fileInfo}\n fileState={roomFilesProgress[fileInfo.pathname]}\n />\n ))}\n </div>\n );\n};\n\nexport {FileDataSourcesPanel};\n"]}
1
+ {"version":3,"file":"FileDataSourcesPanel.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourcesPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,oBAAoB,GAA+B,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;IACxE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CACxC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,kBAAkB,IAEjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAH1C,CAAC,CAIN,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,oBAAoB,EAAC,CAAC","sourcesContent":["import {FC} from 'react';\nimport {FileDataSourceCard} from './FileDataSourceCard';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\n\nconst FileDataSourcesPanel: FC<{isReadOnly?: boolean}> = ({isReadOnly}) => {\n const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);\n const roomFilesProgress = useBaseRoomShellStore(\n (state) => state.room.roomFilesProgress,\n );\n\n return (\n <div className=\"flex flex-grow flex-col overflow-auto\">\n {roomFiles.map((fileInfo, i) => (\n <FileDataSourceCard\n key={i}\n isReadOnly={isReadOnly}\n fileInfo={fileInfo}\n fileState={roomFilesProgress[fileInfo.pathname]}\n />\n ))}\n </div>\n );\n};\n\nexport {FileDataSourcesPanel};\n"]}
@@ -2,7 +2,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { DataTableModal } from '@sqlrooms/data-table';
3
3
  import { cn, useDisclosure } from '@sqlrooms/ui';
4
4
  import { useState } from 'react';
5
- import { useBaseRoomShellStore } from '../RoomShellStore';
5
+ import { useBaseRoomShellStore } from '../RoomShellSlice';
6
6
  import { TableCard } from './TableCard';
7
7
  const TablesListPanel = ({ className, isReadOnly }) => {
8
8
  const tables = useBaseRoomShellStore((state) => state.db.tables);
@@ -1 +1 @@
1
- {"version":3,"file":"TablesListPanel.js","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,EAAE,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,eAAe,GAGhB,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CACnC,CAAC;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,SAAS,CACV,CAAC;IACF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAC,GAAG,aAAa,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC;QACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,SAAS,IAER,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAJpC,CAAC,CAKN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,cAAc,IACb,SAAS,EAAC,uBAAuB,EACjC,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;iBACrB,EACD,KAAK,EAAE,aAAa,EAAE,SAAS,EAC/B,KAAK,EAAE,iBAAiB,aAAa,EAAE,SAAS,EAAE,GAClD,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {cn, useDisclosure} from '@sqlrooms/ui';\nimport {FC, useState} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\nimport {TableCard} from './TableCard';\n\nconst TablesListPanel: FC<{\n className?: string;\n isReadOnly?: boolean;\n}> = ({className, isReadOnly}) => {\n const tables = useBaseRoomShellStore((state) => state.db.tables);\n const tableRowCounts = useBaseRoomShellStore(\n (state) => state.db.tableRowCounts,\n );\n\n const [selectedTable, setSelectedTable] = useState<DataTable | undefined>(\n undefined,\n );\n const {isOpen, onOpen, onClose} = useDisclosure();\n\n const handleClick = (table: DataTable) => {\n onOpen();\n setSelectedTable(table);\n };\n\n const handleClose = () => {\n onClose();\n setSelectedTable(undefined);\n };\n\n return (\n <>\n <div\n className={cn(\n 'relative flex flex-grow flex-col items-stretch gap-2',\n className,\n )}\n >\n {tables?.length ? (\n <div className=\"flex flex-col gap-2\">\n {tables.map((table, i) => (\n <TableCard\n key={i}\n onClick={() => handleClick(table)}\n isReadOnly={isReadOnly}\n value={table}\n rowCount={tableRowCounts[table.tableName]}\n />\n ))}\n </div>\n ) : null}\n </div>\n\n <DataTableModal\n className=\"h-[80vh] max-w-[75vw]\"\n tableModal={{\n isOpen: isOpen,\n onClose: handleClose,\n }}\n title={selectedTable?.tableName}\n query={`SELECT * FROM ${selectedTable?.tableName}`}\n />\n </>\n );\n};\n\nexport {TablesListPanel};\n"]}
1
+ {"version":3,"file":"TablesListPanel.js","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,EAAE,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,eAAe,GAGhB,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CACnC,CAAC;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,SAAS,CACV,CAAC;IACF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAC,GAAG,aAAa,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC;QACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,SAAS,IAER,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAJpC,CAAC,CAKN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,cAAc,IACb,SAAS,EAAC,uBAAuB,EACjC,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;iBACrB,EACD,KAAK,EAAE,aAAa,EAAE,SAAS,EAC/B,KAAK,EAAE,iBAAiB,aAAa,EAAE,SAAS,EAAE,GAClD,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {cn, useDisclosure} from '@sqlrooms/ui';\nimport {FC, useState} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {TableCard} from './TableCard';\n\nconst TablesListPanel: FC<{\n className?: string;\n isReadOnly?: boolean;\n}> = ({className, isReadOnly}) => {\n const tables = useBaseRoomShellStore((state) => state.db.tables);\n const tableRowCounts = useBaseRoomShellStore(\n (state) => state.db.tableRowCounts,\n );\n\n const [selectedTable, setSelectedTable] = useState<DataTable | undefined>(\n undefined,\n );\n const {isOpen, onOpen, onClose} = useDisclosure();\n\n const handleClick = (table: DataTable) => {\n onOpen();\n setSelectedTable(table);\n };\n\n const handleClose = () => {\n onClose();\n setSelectedTable(undefined);\n };\n\n return (\n <>\n <div\n className={cn(\n 'relative flex flex-grow flex-col items-stretch gap-2',\n className,\n )}\n >\n {tables?.length ? (\n <div className=\"flex flex-col gap-2\">\n {tables.map((table, i) => (\n <TableCard\n key={i}\n onClick={() => handleClick(table)}\n isReadOnly={isReadOnly}\n value={table}\n rowCount={tableRowCounts[table.tableName]}\n />\n ))}\n </div>\n ) : null}\n </div>\n\n <DataTableModal\n className=\"h-[80vh] max-w-[75vw]\"\n tableModal={{\n isOpen: isOpen,\n onClose: handleClose,\n }}\n title={selectedTable?.tableName}\n query={`SELECT * FROM ${selectedTable?.tableName}`}\n />\n </>\n );\n};\n\nexport {TablesListPanel};\n"]}
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
11
11
  export { RoomPanel } from './panels/RoomPanel';
12
12
  export { RoomPanelHeader } from './panels/RoomPanelHeader';
13
13
  export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
14
- export { createRoomShellSlice, createSlice, useBaseRoomShellStore, type RoomShellSliceState, } from './RoomShellStore';
14
+ export { createRoomShellSlice, useBaseRoomShellStore, type RoomShellSliceState, } from './RoomShellSlice';
15
15
  export type { StateCreator, StoreApi } from 'zustand';
16
16
  export { DataSourceStatus, type DataSourceState, type RoomFileInfo, type RoomFileState, } from './types';
17
17
  export * from '@sqlrooms/room-store';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
11
11
  export { RoomPanel } from './panels/RoomPanel';
12
12
  export { RoomPanelHeader } from './panels/RoomPanelHeader';
13
13
  export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
14
- export { createRoomShellSlice, createSlice, useBaseRoomShellStore, } from './RoomShellStore';
14
+ export { createRoomShellSlice, useBaseRoomShellStore, } from './RoomShellSlice';
15
15
  export { DataSourceStatus, } from './types';
16
16
  export * from '@sqlrooms/room-store';
17
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {RoomShell} from './RoomShell';\n\nexport {FileDataSourceCard} from './data-sources/FileDataSourceCard';\nexport {FileDataSourcesPanel} from './data-sources/FileDataSourcesPanel';\nexport {TableCard} from './data-sources/TableCard';\nexport {TablesListPanel} from './data-sources/TablesListPanel';\n\nexport {PanelHeaderButton} from './panels/RoomHeaderButton';\nexport {RoomPanel} from './panels/RoomPanel';\nexport {RoomPanelHeader} from './panels/RoomPanelHeader';\n\nexport {\n RoomShellSidebarButton,\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\n\nexport {\n createRoomShellSlice,\n createSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n} from './RoomShellStore';\n\nexport type {StateCreator, StoreApi} from 'zustand';\n\nexport {\n DataSourceStatus,\n type DataSourceState,\n type RoomFileInfo,\n type RoomFileState,\n} from './types';\n\nexport * from '@sqlrooms/room-store';\n\nexport {type RoomPanelInfo} from '@sqlrooms/layout';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {RoomShell} from './RoomShell';\n\nexport {FileDataSourceCard} from './data-sources/FileDataSourceCard';\nexport {FileDataSourcesPanel} from './data-sources/FileDataSourcesPanel';\nexport {TableCard} from './data-sources/TableCard';\nexport {TablesListPanel} from './data-sources/TablesListPanel';\n\nexport {PanelHeaderButton} from './panels/RoomHeaderButton';\nexport {RoomPanel} from './panels/RoomPanel';\nexport {RoomPanelHeader} from './panels/RoomPanelHeader';\n\nexport {\n RoomShellSidebarButton,\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\n\nexport {\n createRoomShellSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n} from './RoomShellSlice';\n\nexport type {StateCreator, StoreApi} from 'zustand';\n\nexport {\n DataSourceStatus,\n type DataSourceState,\n type RoomFileInfo,\n type RoomFileState,\n} from './types';\n\nexport * from '@sqlrooms/room-store';\n\nexport {type RoomPanelInfo} from '@sqlrooms/layout';\n"]}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { PinIcon, PinOffIcon, XIcon } from 'lucide-react';
3
3
  import { useMemo } from 'react';
4
- import { useBaseRoomShellStore } from '../RoomShellStore';
4
+ import { useBaseRoomShellStore } from '../RoomShellSlice';
5
5
  import { PanelHeaderButton } from './RoomHeaderButton';
6
6
  const RoomPanelHeader = (props) => {
7
7
  const { showHeader = true, panelKey: type, children } = props;
@@ -9,7 +9,7 @@ const RoomPanelHeader = (props) => {
9
9
  const { icon: Icon, title } = panels[type] ?? {};
10
10
  const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
11
11
  const togglePanelPin = useBaseRoomShellStore((state) => state.layout.togglePanelPin);
12
- const pinnedPanels = useBaseRoomShellStore((state) => state.config.layout.pinned);
12
+ const pinnedPanels = useBaseRoomShellStore((state) => state.layout.config.pinned);
13
13
  const isPinned = useMemo(() => pinnedPanels?.includes(type), [pinnedPanels, type]);
14
14
  return (_jsxs("div", { className: "flex", children: [_jsxs("div", { className: "flex w-full flex-row items-center gap-2", children: [showHeader && (_jsxs(_Fragment, { children: [Icon ? _jsx(Icon, { className: "h-4 w-4" }) : null, _jsx("h2", { className: "text-muted-foreground text-xs font-semibold uppercase", children: title })] })), children] }), _jsxs("div", { className: "bg-secondary/50 flex gap-0", children: [_jsx(PanelHeaderButton, { isPinned: isPinned, icon: isPinned ? (_jsx(PinIcon, { className: "w-[18px]" })) : (_jsx(PinOffIcon, { className: "w-[18px]" })), onClick: () => togglePanelPin(type), label: "Pin panel" }), _jsx(PanelHeaderButton, { icon: _jsx(XIcon, { className: "w-[18px]" }), onClick: () => togglePanel(type), label: `Close panel "${title}"` })] })] }));
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RoomPanelHeader.js","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAErD,MAAM,eAAe,GAIhB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CACpC,CAAC;IACF,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CACvC,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC,YAAY,EAAE,IAAI,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eAAK,SAAS,EAAC,yCAAyC,aACrD,UAAU,IAAI,CACb,8BACG,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3C,aAAI,SAAS,EAAC,uDAAuD,YAClE,KAAK,GACH,IACJ,CACJ,EACA,QAAQ,IACL,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,SAAS,EAAC,UAAU,GAAG,CACjC,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,SAAS,EAAC,UAAU,GAAG,CACpC,EAEH,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAC,WAAW,GACjB,EACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,GAAG,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,gBAAgB,KAAK,GAAG,GAC/B,IACE,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {PinIcon, PinOffIcon, XIcon} from 'lucide-react';\nimport {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\nimport {PanelHeaderButton} from './RoomHeaderButton';\n\nconst RoomPanelHeader: FC<{\n panelKey: string;\n showHeader?: boolean;\n children?: React.ReactNode;\n}> = (props) => {\n const {showHeader = true, panelKey: type, children} = props;\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const {icon: Icon, title} = panels[type] ?? {};\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const togglePanelPin = useBaseRoomShellStore(\n (state) => state.layout.togglePanelPin,\n );\n const pinnedPanels = useBaseRoomShellStore(\n (state) => state.config.layout.pinned,\n );\n const isPinned = useMemo(\n () => pinnedPanels?.includes(type),\n [pinnedPanels, type],\n );\n\n return (\n <div className=\"flex\">\n <div className=\"flex w-full flex-row items-center gap-2\">\n {showHeader && (\n <>\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n <h2 className=\"text-muted-foreground text-xs font-semibold uppercase\">\n {title}\n </h2>\n </>\n )}\n {children}\n </div>\n <div className=\"bg-secondary/50 flex gap-0\">\n <PanelHeaderButton\n isPinned={isPinned}\n icon={\n isPinned ? (\n <PinIcon className=\"w-[18px]\" />\n ) : (\n <PinOffIcon className=\"w-[18px]\" />\n )\n }\n onClick={() => togglePanelPin(type)}\n label=\"Pin panel\"\n />\n <PanelHeaderButton\n icon={<XIcon className=\"w-[18px]\" />}\n onClick={() => togglePanel(type)}\n label={`Close panel \"${title}\"`}\n />\n </div>\n </div>\n );\n};\n\nexport {RoomPanelHeader};\n"]}
1
+ {"version":3,"file":"RoomPanelHeader.js","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAErD,MAAM,eAAe,GAIhB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CACpC,CAAC;IACF,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CACvC,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC,YAAY,EAAE,IAAI,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eAAK,SAAS,EAAC,yCAAyC,aACrD,UAAU,IAAI,CACb,8BACG,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3C,aAAI,SAAS,EAAC,uDAAuD,YAClE,KAAK,GACH,IACJ,CACJ,EACA,QAAQ,IACL,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,SAAS,EAAC,UAAU,GAAG,CACjC,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,SAAS,EAAC,UAAU,GAAG,CACpC,EAEH,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAC,WAAW,GACjB,EACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,GAAG,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,gBAAgB,KAAK,GAAG,GAC/B,IACE,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {PinIcon, PinOffIcon, XIcon} from 'lucide-react';\nimport {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {PanelHeaderButton} from './RoomHeaderButton';\n\nconst RoomPanelHeader: FC<{\n panelKey: string;\n showHeader?: boolean;\n children?: React.ReactNode;\n}> = (props) => {\n const {showHeader = true, panelKey: type, children} = props;\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const {icon: Icon, title} = panels[type] ?? {};\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const togglePanelPin = useBaseRoomShellStore(\n (state) => state.layout.togglePanelPin,\n );\n const pinnedPanels = useBaseRoomShellStore(\n (state) => state.layout.config.pinned,\n );\n const isPinned = useMemo(\n () => pinnedPanels?.includes(type),\n [pinnedPanels, type],\n );\n\n return (\n <div className=\"flex\">\n <div className=\"flex w-full flex-row items-center gap-2\">\n {showHeader && (\n <>\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n <h2 className=\"text-muted-foreground text-xs font-semibold uppercase\">\n {title}\n </h2>\n </>\n )}\n {children}\n </div>\n <div className=\"bg-secondary/50 flex gap-0\">\n <PanelHeaderButton\n isPinned={isPinned}\n icon={\n isPinned ? (\n <PinIcon className=\"w-[18px]\" />\n ) : (\n <PinOffIcon className=\"w-[18px]\" />\n )\n }\n onClick={() => togglePanelPin(type)}\n label=\"Pin panel\"\n />\n <PanelHeaderButton\n icon={<XIcon className=\"w-[18px]\" />}\n onClick={() => togglePanel(type)}\n label={`Close panel \"${title}\"`}\n />\n </div>\n </div>\n );\n};\n\nexport {RoomPanelHeader};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/room-shell",
3
- "version": "0.26.0-rc.3",
3
+ "version": "0.26.0-rc.5",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -25,18 +25,18 @@
25
25
  "typedoc": "typedoc"
26
26
  },
27
27
  "dependencies": {
28
- "@sqlrooms/data-table": "0.26.0-rc.3",
29
- "@sqlrooms/duckdb": "0.26.0-rc.3",
30
- "@sqlrooms/layout": "0.26.0-rc.3",
31
- "@sqlrooms/layout-config": "0.26.0-rc.3",
32
- "@sqlrooms/room-config": "0.26.0-rc.3",
33
- "@sqlrooms/room-store": "0.26.0-rc.3",
34
- "@sqlrooms/ui": "0.26.0-rc.3",
35
- "@sqlrooms/utils": "0.26.0-rc.3",
28
+ "@sqlrooms/data-table": "0.26.0-rc.5",
29
+ "@sqlrooms/duckdb": "0.26.0-rc.5",
30
+ "@sqlrooms/layout": "0.26.0-rc.5",
31
+ "@sqlrooms/layout-config": "0.26.0-rc.5",
32
+ "@sqlrooms/room-config": "0.26.0-rc.5",
33
+ "@sqlrooms/room-store": "0.26.0-rc.5",
34
+ "@sqlrooms/ui": "0.26.0-rc.5",
35
+ "@sqlrooms/utils": "0.26.0-rc.5",
36
36
  "apache-arrow": "17.0.0",
37
37
  "immer": "^10.1.3",
38
38
  "lucide-react": "^0.544.0",
39
- "react-mosaic-component": "5.3.0",
39
+ "react-mosaic-component": "^6.1.1",
40
40
  "zod": "^4.1.8",
41
41
  "zustand": "^5.0.8"
42
42
  },
@@ -44,5 +44,5 @@
44
44
  "react": ">=18",
45
45
  "react-dom": ">=18"
46
46
  },
47
- "gitHead": "536764b2aa924e5bb6650fe0bc674113179ff444"
47
+ "gitHead": "dc1c3b765718c8748aa11cce3cc83f907d3e5963"
48
48
  }
@@ -1,97 +0,0 @@
1
- import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
2
- import { LayoutSliceState, RoomPanelInfo } from '@sqlrooms/layout';
3
- import { BaseRoomConfig, DataSource, FileDataSource } from '@sqlrooms/room-config';
4
- import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/room-store';
5
- import { ProgressInfo } from '@sqlrooms/utils';
6
- import { ReactNode } from 'react';
7
- import { StateCreator, StoreApi } from 'zustand';
8
- import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
9
- export type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<RoomShellSliceState<PC>>;
10
- export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps<PC> & {
11
- roomFiles: RoomFileInfo[];
12
- roomFilesProgress: {
13
- [pathname: string]: RoomFileState;
14
- };
15
- isDataAvailable: boolean;
16
- dataSourceStates: {
17
- [tableName: string]: DataSourceState;
18
- };
19
- /**
20
- * Load a file data source. A fileDataSourceLoader implementation can be passed to
21
- * createRoomShellSlice to specify how file data sources should be loaded.
22
- *
23
- * @example
24
- * ```ts
25
- * ...createRoomShellSlice<RoomConfig>({
26
- * config: {
27
- * dataSources: [
28
- * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },
29
- * ],
30
- * },
31
- * room: {
32
- * fileDataSourceLoader: async ({fileName}, onProgress) =>
33
- * await downloadFile(`https://some.url/${fileName}`, {onProgress}),
34
- * },
35
- * })(set, get, store)
36
- * ```
37
- *
38
- * @param fileName - The name of the file to load.
39
- * @param onProgress - A callback to report the progress of the download.
40
- * @returns The loaded file.
41
- */
42
- fileDataSourceLoader?: ({ fileName }: FileDataSource, onProgress: (progress: ProgressInfo) => void) => Promise<Uint8Array | File>;
43
- CustomErrorBoundary: React.ComponentType<{
44
- onRetry?: () => void;
45
- children?: ReactNode;
46
- }>;
47
- };
48
- export type RoomShellSliceStateActions<PC extends BaseRoomConfig> = RoomStateActions<PC> & {
49
- setRoomTitle(title: string): void;
50
- setDescription(description: string): void;
51
- /**
52
- * Add or update a SQL query data source.
53
- * @param tableName - The name of the table to create or update.
54
- * @param query - The SQL query to execute.
55
- * @param oldTableName - The name of the table to replace (optional).
56
- */
57
- addOrUpdateSqlQueryDataSource(tableName: string, query: string, oldTableName?: string): Promise<void>;
58
- areDatasetsReady(): boolean;
59
- addRoomFile(file: File | string, tableName?: string, loadFileOptions?: LoadFileOptions): Promise<DataTable | undefined>;
60
- /**
61
- * @deprecated Use removeDataSource or removeRoomFile instead
62
- */
63
- removeSqlQueryDataSource(tableName: string): Promise<void>;
64
- /**
65
- * Removes a data source from the room by tableName.
66
- * @param tableName - The name of the table of the data source to remove.
67
- */
68
- removeDataSource(tableName: string): Promise<void>;
69
- /**
70
- * Removes a file data source from the room by pathname.
71
- * @param pathname - The pathname of the file to remove.
72
- */
73
- removeRoomFile(pathname: string): Promise<void>;
74
- setRoomFiles(info: RoomFileInfo[]): void;
75
- setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
76
- addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
77
- };
78
- export type RoomShellSliceState<PC extends BaseRoomConfig = BaseRoomConfig> = RoomState<PC> & {
79
- initialize?: () => Promise<void>;
80
- config: PC;
81
- room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;
82
- } & DuckDbSliceState & LayoutSliceState;
83
- /**
84
- * This type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.
85
- */
86
- type InitialState<PC extends BaseRoomConfig> = {
87
- connector?: DuckDbConnector;
88
- config: Partial<PC>;
89
- room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {
90
- panels?: Record<string, RoomPanelInfo>;
91
- };
92
- };
93
- export declare function createRoomShellSlice<PC extends BaseRoomConfig = BaseRoomConfig>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>>;
94
- export declare function useBaseRoomShellStore<PC extends BaseRoomConfig, PS extends RoomShellSliceState<PC>, T>(selector: (state: RoomShellSliceState<PC>) => T): T;
95
- export declare function createSlice<PC extends BaseRoomConfig, S>(sliceCreator: (...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>) => S): StateCreator<S>;
96
- export {};
97
- //# sourceMappingURL=RoomShellStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EAEf,gBAAgB,EAChB,eAAe,EAGhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,gBAAgB,EAChB,aAAa,EAGd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,UAAU,EAEV,cAAc,EAMf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,cAAc,EAIf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,EAIb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAChC,OAAO,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAE/C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,cAAc,IAAI,QAAQ,CAC9D,mBAAmB,CAAC,EAAE,CAAC,CACxB,CAAC;AAUF,MAAM,MAAM,wBAAwB,CAAC,EAAE,SAAS,cAAc,IAC5D,cAAc,CAAC,EAAE,CAAC,GAAG;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,iBAAiB,EAAE;QAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAA;KAAC,CAAC;IACvD,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE;QAAC,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAAA;KAAC,CAAC;IACzD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,oBAAoB,CAAC,EAAE,CACrB,EAAC,QAAQ,EAAC,EAAE,cAAc,EAC1B,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,KACzC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChC,mBAAmB,EAAE,KAAK,CAAC,aAAa,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;QACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC,CAAC;CACJ,CAAC;AAEJ,MAAM,MAAM,0BAA0B,CAAC,EAAE,SAAS,cAAc,IAC9D,gBAAgB,CAAC,EAAE,CAAC,GAAG;IACrB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C;;;;;OAKG;IACH,6BAA6B,CAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,gBAAgB,IAAI,OAAO,CAAC;IAE5B,WAAW,CACT,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAClC;;OAEG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACzC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IACtE,aAAa,EAAE,CACb,UAAU,EAAE,UAAU,EACtB,MAAM,CAAC,EAAE,gBAAgB,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEJ,MAAM,MAAM,mBAAmB,CAAC,EAAE,SAAS,cAAc,GAAG,cAAc,IACxE,SAAS,CAAC,EAAE,CAAC,GAAG;IACd,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,EAAE,EAAE,CAAC;IACX,IAAI,EAAE,wBAAwB,CAAC,EAAE,CAAC,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;CACrE,GAAG,gBAAgB,GAClB,gBAAgB,CAAC;AAErB;;GAEG;AACH,KAAK,YAAY,CAAC,EAAE,SAAS,cAAc,IAAI;IAC7C,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG;QAC5D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;KACxC,CAAC;CACH,CAAC;AAMF,wBAAgB,oBAAoB,CAClC,EAAE,SAAS,cAAc,GAAG,cAAc,EAC1C,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAyfhE;AAED,wBAAgB,qBAAqB,CACnC,EAAE,SAAS,cAAc,EACzB,EAAE,SAAS,mBAAmB,CAAC,EAAE,CAAC,EAClC,CAAC,EACD,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAEpD;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC,EACtD,YAAY,EAAE,CACZ,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,KAC3D,CAAC,GACL,YAAY,CAAC,CAAC,CAAC,CAOjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceConfig,\n DuckDbSliceState,\n LoadFileOptions,\n createDefaultDuckDbConfig,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n LayoutSliceConfig,\n LayoutSliceState,\n RoomPanelInfo,\n createDefaultLayoutConfig,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n SqlQueryDataSource,\n UrlDataSource,\n isFileDataSource,\n isUrlDataSource,\n isSqlQueryDataSource,\n} from '@sqlrooms/room-config';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateProps,\n createRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {createDefaultBaseRoomConfig} from '@sqlrooms/room-config';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<\n RoomShellSliceState<PC>\n>;\n\nconst INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n ...createDefaultBaseRoomConfig(),\n ...createDefaultDuckDbConfig(),\n ...createDefaultLayoutConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n /**\n * Load a file data source. A fileDataSourceLoader implementation can be passed to\n * createRoomShellSlice to specify how file data sources should be loaded.\n *\n * @example\n * ```ts\n * ...createRoomShellSlice<RoomConfig>({\n * config: {\n * dataSources: [\n * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },\n * ],\n * },\n * room: {\n * fileDataSourceLoader: async ({fileName}, onProgress) =>\n * await downloadFile(`https://some.url/${fileName}`, {onProgress}),\n * },\n * })(set, get, store)\n * ```\n *\n * @param fileName - The name of the file to load.\n * @param onProgress - A callback to report the progress of the download.\n * @returns The loaded file.\n */\n fileDataSourceLoader?: (\n {fileName}: FileDataSource,\n onProgress: (progress: ProgressInfo) => void,\n ) => Promise<Uint8Array | File>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<void>;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n\nexport type RoomShellSliceState<PC extends BaseRoomConfig = BaseRoomConfig> =\n RoomState<PC> & {\n initialize?: () => Promise<void>;\n config: PC;\n room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;\n } & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype InitialState<PC extends BaseRoomConfig> = {\n connector?: DuckDbConnector;\n config: Partial<PC>;\n room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {\n panels?: Record<string, RoomPanelInfo>;\n };\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice<\n PC extends BaseRoomConfig = BaseRoomConfig,\n>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>> {\n const slice: StateCreator<RoomShellSliceState<PC>> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n room: roomStateProps,\n ...restState\n } = props;\n const initialConfig: PC = {\n ...INITIAL_BASE_ROOM_CONFIG,\n ...configProps,\n } as PC;\n const initialRoomState = {\n CustomErrorBoundary: ErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n ...roomStateProps,\n };\n const roomSliceState = createRoomSlice({\n config: initialConfig,\n room: initialRoomState,\n })(set, get, store);\n\n const roomState: RoomShellSliceState<PC> = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice({panels: roomStateProps.panels})(set, get, store),\n room: {\n ...initialRoomState,\n ...roomSliceState.room,\n async initialize() {\n await roomSliceState.room.initialize();\n\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n setRoomConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config = castDraft(config);\n }),\n ),\n setLastSavedConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.lastSavedConfig = castDraft(config);\n }),\n ),\n hasUnsavedChanges: () => {\n const {lastSavedConfig} = get().room;\n const {config} = get();\n return config !== lastSavedConfig;\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.config.dataSources = draft.config.dataSources.map(\n (dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource && isFileDataSource(dataSource)) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().config.dataSources.find(\n (d) => isFileDataSource(d) && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\n }\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const {dataSourceStates} = get().room;\n const {config} = get();\n const dataSources = config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restState,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get();\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n if (isFileDataSource(ds)) {\n return !roomFilesProgress[ds.fileName];\n }\n if (isUrlDataSource(ds)) {\n return !roomFilesProgress[ds.url];\n }\n return false;\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(isSqlQueryDataSource);\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n const onProgress = (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n };\n try {\n let downloadedFile: Uint8Array | File;\n if (isFileDataSource(ds)) {\n const {fileDataSourceLoader} = get().room;\n if (!fileDataSourceLoader) {\n throw new Error('fileDataSourceLoader is not defined');\n }\n downloadedFile = await fileDataSourceLoader(ds, onProgress);\n } else if (isUrlDataSource(ds)) {\n const url = ds.url;\n downloadedFile = await downloadFile(url, {\n method: ds.httpMethod,\n headers: ds.headers,\n onProgress,\n });\n } else {\n // This should never happen as filesToDownload only contains FileDataSource | UrlDataSource\n throw new Error('Unsupported data source type');\n }\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n downloadedFile instanceof File\n ? downloadedFile\n : new File([new Uint8Array(downloadedFile)], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n\n return roomState;\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<\n PC extends BaseRoomConfig,\n PS extends RoomShellSliceState<PC>,\n T,\n>(selector: (state: RoomShellSliceState<PC>) => T): T {\n return useBaseRoomStore<PC, PS, T>(selector as (state: RoomState<PC>) => T);\n}\n\nexport function createSlice<PC extends BaseRoomConfig, S>(\n sliceCreator: (\n ...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>\n ) => S,\n): StateCreator<S> {\n return (set, get, store) =>\n sliceCreator(\n set,\n get as () => S & RoomShellSliceState<PC>,\n store as StoreApi<S & RoomShellSliceState<PC>>,\n );\n}\n"]}