LogoPicker.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useBreakpoint } from 'common'
  2. import { ChevronLeft } from 'lucide-react'
  3. import { useEffect, useState } from 'react'
  4. import {
  5. Button,
  6. Dialog,
  7. DialogContent,
  8. DialogHeader,
  9. DialogTitle,
  10. Sheet,
  11. SheetContent,
  12. SheetHeader,
  13. SheetTitle,
  14. } from 'ui'
  15. import { BucketFilePickerExplorer } from '../../Storage/BucketFilePickerDialog/BucketFilePickerExplorer'
  16. import { BucketFilePickerStateContextProvider } from '../../Storage/BucketFilePickerDialog/BucketFilePickerState'
  17. import { BucketsPicker } from '../../Storage/BucketsPickerDialog/BucketsPicker'
  18. import type { Bucket } from '@/data/storage/buckets-query'
  19. export type StorageFilePickerProps = {
  20. open: boolean
  21. onOpenChange: (open: boolean) => void
  22. onSelect: (value: string) => void
  23. }
  24. export function LogoPicker({ open, onOpenChange, onSelect }: StorageFilePickerProps) {
  25. const [selectedBucket, setSelectedBucket] = useState<Bucket | null>(null)
  26. const isMobileLayout = useBreakpoint('lg')
  27. useEffect(() => {
  28. if (!open) {
  29. setSelectedBucket(null)
  30. }
  31. }, [open])
  32. const handleSelect = (value: string) => {
  33. onSelect(value)
  34. onOpenChange(false)
  35. }
  36. return (
  37. <>
  38. {isMobileLayout ? (
  39. <Sheet open={open} onOpenChange={onOpenChange}>
  40. <SheetContent side="bottom" className="flex h-[85vh] flex-col gap-0 p-0">
  41. {selectedBucket ? (
  42. <SheetHeader className="flex flex-row items-center gap-2 border-b border-overlay px-6 py-4">
  43. <Button
  44. type="text"
  45. size="tiny"
  46. icon={<ChevronLeft size={16} />}
  47. className="shrink-0"
  48. onClick={() => setSelectedBucket(null)}
  49. >
  50. Buckets
  51. </Button>
  52. <SheetTitle className="min-w-0 flex-1">Choose a file</SheetTitle>
  53. </SheetHeader>
  54. ) : (
  55. <SheetHeader className="flex flex-row items-center gap-2 border-b border-overlay px-6 py-4">
  56. <SheetTitle className="min-w-0 flex-1">Select a bucket</SheetTitle>
  57. </SheetHeader>
  58. )}
  59. <div className="flex h-full min-h-0 min-w-0 flex-1 flex-col px-2 pb-3 pt-2">
  60. {selectedBucket ? (
  61. <BucketFilePickerStateContextProvider
  62. bucket={selectedBucket}
  63. maxFiles={1}
  64. acceptedFileExtensions={['.png', '.jpg', '.jpeg', '.svg']}
  65. >
  66. <BucketFilePickerExplorer onSelect={handleSelect} />
  67. </BucketFilePickerStateContextProvider>
  68. ) : (
  69. <BucketsPicker onSelectBucket={setSelectedBucket} allowedBucketType="public" />
  70. )}
  71. </div>
  72. </SheetContent>
  73. </Sheet>
  74. ) : (
  75. <Dialog open={open} onOpenChange={onOpenChange}>
  76. <DialogContent
  77. size="xxlarge"
  78. className="flex h-[85vh] max-h-[500px] max-w-5xl flex-col gap-0 overflow-hidden p-0"
  79. >
  80. {selectedBucket ? (
  81. <DialogHeader className="flex flex-row items-center gap-2 border-b border-overlay px-6 py-4 h-[60px]">
  82. <Button
  83. type="text"
  84. size="tiny"
  85. icon={<ChevronLeft size={16} />}
  86. className="shrink-0"
  87. onClick={() => setSelectedBucket(null)}
  88. >
  89. Buckets
  90. </Button>
  91. <DialogTitle className="min-w-0 flex-1">Choose a file</DialogTitle>
  92. </DialogHeader>
  93. ) : (
  94. <DialogHeader className="flex flex-row items-center gap-2 border-b border-overlay px-6 py-4 h-[60px]">
  95. <DialogTitle className="min-w-0 flex-1">Select a bucket</DialogTitle>
  96. </DialogHeader>
  97. )}
  98. <div className="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden p-3">
  99. {selectedBucket ? (
  100. <BucketFilePickerStateContextProvider
  101. bucket={selectedBucket}
  102. maxFiles={1}
  103. acceptedFileExtensions={['.png', '.jpg', '.jpeg', '.svg']}
  104. >
  105. <BucketFilePickerExplorer onSelect={handleSelect} />
  106. </BucketFilePickerStateContextProvider>
  107. ) : (
  108. <BucketsPicker onSelectBucket={setSelectedBucket} allowedBucketType="public" />
  109. )}
  110. </div>
  111. </DialogContent>
  112. </Dialog>
  113. )}
  114. </>
  115. )
  116. }