Database.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { useEffect, useRef, useState } from 'react';
  2. import { proxy } from 'valtio';
  3. import { subscribeKey } from 'valtio/utils';
  4. import { DatabaseLayoutPB } from '@/services/backend';
  5. import { DndContext, DndContextDescriptor } from './_shared';
  6. import { VerticalScrollElementRefContext, DatabaseContext } from './database.context';
  7. import { useViewId, useConnectDatabase } from './database.hooks';
  8. import { DatabaseHeader } from './DatabaseHeader';
  9. import { Grid } from './grid';
  10. export const Database = () => {
  11. const viewId = useViewId();
  12. const verticalScrollElementRef = useRef<HTMLDivElement>(null);
  13. const database = useConnectDatabase(viewId);
  14. const [ layoutType, setLayoutType ] = useState(database.layoutType);
  15. const dndContext = useRef(proxy<DndContextDescriptor>({
  16. dragging: null,
  17. }));
  18. useEffect(() => {
  19. return subscribeKey(database, 'layoutType', (value) => {
  20. setLayoutType(value);
  21. });
  22. }, [database]);
  23. return (
  24. <div
  25. ref={verticalScrollElementRef}
  26. className="h-full overflow-y-auto"
  27. >
  28. <DatabaseHeader />
  29. <VerticalScrollElementRefContext.Provider value={verticalScrollElementRef}>
  30. <DndContext.Provider value={dndContext.current}>
  31. <DatabaseContext.Provider value={database}>
  32. {layoutType === DatabaseLayoutPB.Grid ? <Grid /> : null}
  33. </DatabaseContext.Provider>
  34. </DndContext.Provider >
  35. </VerticalScrollElementRefContext.Provider>
  36. </div>
  37. );
  38. };