2
0
Files
bot/apps/builder/components/shared/ImageUploadContent/ImageUploadContent.tsx

150 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-08-08 08:21:36 +02:00
import { useState } from 'react'
2022-08-12 08:34:53 +02:00
import { Button, Flex, HStack, Stack } from '@chakra-ui/react'
2022-01-20 16:14:47 +01:00
import { UploadButton } from '../buttons/UploadButton'
2022-08-12 08:34:53 +02:00
import { GiphySearchForm } from './GiphySearchForm'
import { Input } from '../Textbox/Input'
2022-08-08 08:21:36 +02:00
import { EmojiSearchableList } from './emoji/EmojiSearchableList'
2022-01-20 16:14:47 +01:00
type Props = {
filePath: string
includeFileName?: boolean
defaultUrl?: string
isEmojiEnabled?: boolean
isGiphyEnabled?: boolean
onSubmit: (url: string) => void
onClose?: () => void
2022-01-20 16:14:47 +01:00
}
export const ImageUploadContent = ({
filePath,
includeFileName,
defaultUrl,
onSubmit,
isEmojiEnabled = false,
isGiphyEnabled = true,
onClose,
}: Props) => {
const [currentTab, setCurrentTab] = useState<
'link' | 'upload' | 'giphy' | 'emoji'
>(isEmojiEnabled ? 'emoji' : 'upload')
const handleSubmit = (url: string) => {
onSubmit(url)
onClose && onClose()
}
2022-01-20 16:14:47 +01:00
return (
<Stack>
<HStack>
{isEmojiEnabled && (
<Button
variant={currentTab === 'emoji' ? 'solid' : 'ghost'}
onClick={() => setCurrentTab('emoji')}
size="sm"
>
Emoji
</Button>
)}
2022-01-20 16:14:47 +01:00
<Button
variant={currentTab === 'upload' ? 'solid' : 'ghost'}
onClick={() => setCurrentTab('upload')}
size="sm"
>
Upload
</Button>
<Button
variant={currentTab === 'link' ? 'solid' : 'ghost'}
onClick={() => setCurrentTab('link')}
size="sm"
>
Embed link
</Button>
{isGiphyEnabled && (
2022-01-20 16:14:47 +01:00
<Button
variant={currentTab === 'giphy' ? 'solid' : 'ghost'}
onClick={() => setCurrentTab('giphy')}
size="sm"
>
Giphy
</Button>
)}
</HStack>
<BodyContent
filePath={filePath}
includeFileName={includeFileName}
tab={currentTab}
onSubmit={handleSubmit}
defaultUrl={defaultUrl}
/>
2022-01-20 16:14:47 +01:00
</Stack>
)
}
const BodyContent = ({
includeFileName,
filePath,
2022-01-20 16:14:47 +01:00
tab,
defaultUrl,
2022-01-20 16:14:47 +01:00
onSubmit,
}: {
includeFileName?: boolean
filePath: string
tab: 'upload' | 'link' | 'giphy' | 'emoji'
defaultUrl?: string
2022-01-20 16:14:47 +01:00
onSubmit: (url: string) => void
}) => {
switch (tab) {
case 'upload':
return (
<UploadFileContent
filePath={filePath}
includeFileName={includeFileName}
onNewUrl={onSubmit}
/>
)
2022-01-20 16:14:47 +01:00
case 'link':
return <EmbedLinkContent defaultUrl={defaultUrl} onNewUrl={onSubmit} />
2022-01-20 16:14:47 +01:00
case 'giphy':
return <GiphyContent onNewUrl={onSubmit} />
case 'emoji':
2022-08-08 08:21:36 +02:00
return <EmojiSearchableList onEmojiSelected={onSubmit} />
2022-01-20 16:14:47 +01:00
}
}
type ContentProps = { onNewUrl: (url: string) => void }
2022-01-20 16:14:47 +01:00
const UploadFileContent = ({
filePath,
includeFileName,
onNewUrl,
}: ContentProps & { filePath: string; includeFileName?: boolean }) => (
<Flex justify="center" py="2">
<UploadButton
filePath={filePath}
onFileUploaded={onNewUrl}
includeFileName={includeFileName}
colorScheme="blue"
>
Choose an image
</UploadButton>
</Flex>
)
2022-01-20 16:14:47 +01:00
const EmbedLinkContent = ({
defaultUrl,
onNewUrl,
}: ContentProps & { defaultUrl?: string }) => (
<Stack py="2">
<Input
placeholder={'Paste the image link...'}
onChange={onNewUrl}
defaultValue={defaultUrl ?? ''}
/>
</Stack>
)
2022-01-20 16:14:47 +01:00
2022-08-12 08:34:53 +02:00
const GiphyContent = ({ onNewUrl }: ContentProps) => (
<GiphySearchForm onSubmit={onNewUrl} />
)