index.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useBreakpoint } from 'common'
  2. import {
  3. Dialog,
  4. DialogContent,
  5. DialogHeader,
  6. DialogTitle,
  7. Sheet,
  8. SheetContent,
  9. SheetHeader,
  10. SheetTitle,
  11. } from 'ui'
  12. import { BucketFilePickerExplorer } from './BucketFilePickerExplorer'
  13. import { BucketFilePickerStateContextProvider } from './BucketFilePickerState'
  14. import type { Bucket } from '@/data/storage/buckets-query'
  15. export type BucketsFilePickerDialogProps = {
  16. open: boolean
  17. onOpenChange: (open: boolean) => void
  18. selectedBucket: Bucket
  19. acceptedFileExtensions?: string[]
  20. onSelect: (value: string) => void
  21. }
  22. export function BucketsFilePickerDialog({
  23. open,
  24. onOpenChange,
  25. selectedBucket,
  26. acceptedFileExtensions,
  27. onSelect,
  28. }: BucketsFilePickerDialogProps) {
  29. const isMobileLayout = useBreakpoint('lg')
  30. const handleSelect = (value: string) => {
  31. onSelect(value)
  32. onOpenChange(false)
  33. }
  34. return (
  35. <>
  36. {isMobileLayout ? (
  37. <Sheet open={open} onOpenChange={onOpenChange}>
  38. <SheetContent side="bottom" className="flex h-[85vh] flex-col gap-0 p-0">
  39. <SheetHeader className="flex flex-row items-center gap-2 border-b border-overlay px-4 py-3 text-left">
  40. <SheetTitle className="min-w-0 flex-1 text-left">Choose a file</SheetTitle>
  41. </SheetHeader>
  42. <div className="flex h-full min-h-0 min-w-0 flex-1 flex-col px-2 pb-3 pt-2">
  43. <BucketFilePickerStateContextProvider
  44. bucket={selectedBucket}
  45. maxFiles={1}
  46. acceptedFileExtensions={acceptedFileExtensions}
  47. >
  48. <BucketFilePickerExplorer onSelect={handleSelect} />
  49. </BucketFilePickerStateContextProvider>
  50. </div>
  51. </SheetContent>
  52. </Sheet>
  53. ) : (
  54. <Dialog open={open} onOpenChange={onOpenChange}>
  55. <DialogContent
  56. size="xxlarge"
  57. className="flex h-[85vh] max-h-[500px] max-w-5xl flex-col gap-0 overflow-hidden p-0"
  58. >
  59. <DialogHeader className="flex flex-row items-center gap-2 border-b border-overlay px-6 py-4">
  60. <DialogTitle className="min-w-0 flex-1">Choose a file</DialogTitle>
  61. </DialogHeader>
  62. <div className="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden p-3">
  63. <BucketFilePickerStateContextProvider
  64. bucket={selectedBucket}
  65. maxFiles={1}
  66. acceptedFileExtensions={acceptedFileExtensions}
  67. >
  68. <BucketFilePickerExplorer onSelect={handleSelect} />
  69. </BucketFilePickerStateContextProvider>
  70. </div>
  71. </DialogContent>
  72. </Dialog>
  73. )}
  74. </>
  75. )
  76. }