index.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import cn from 'classnames'
  4. import { useTranslation } from 'react-i18next'
  5. import s from './style.module.css'
  6. import Modal from '@/app/components/base/modal'
  7. import Button from '@/app/components/base/button'
  8. import Toast from '@/app/components/base/toast'
  9. import AppIcon from '@/app/components/base/app-icon'
  10. import EmojiPicker from '@/app/components/base/emoji-picker'
  11. export type CreateAppModalProps = {
  12. appName: string
  13. show: boolean
  14. onConfirm: (info: {
  15. name: string
  16. icon: string
  17. icon_background: string
  18. }) => Promise<void>
  19. onHide: () => void
  20. }
  21. const CreateAppModal = ({
  22. appName,
  23. show = false,
  24. onConfirm,
  25. onHide,
  26. }: CreateAppModalProps) => {
  27. const { t } = useTranslation()
  28. const [name, setName] = React.useState('')
  29. const [showEmojiPicker, setShowEmojiPicker] = useState(false)
  30. const [emoji, setEmoji] = useState({ icon: '🤖', icon_background: '#FFEAD5' })
  31. const submit = () => {
  32. if (!name.trim()) {
  33. Toast.notify({ type: 'error', message: t('explore.appCustomize.nameRequired') })
  34. return
  35. }
  36. onConfirm({
  37. name,
  38. ...emoji,
  39. })
  40. onHide()
  41. }
  42. return (
  43. <>
  44. <Modal
  45. isShow={show}
  46. onClose={() => {}}
  47. className={cn(s.modal, '!max-w-[480px]', 'px-8')}
  48. >
  49. <span className={s.close} onClick={onHide}/>
  50. <div className={s.title}>{t('explore.appCustomize.title', { name: appName })}</div>
  51. <div className={s.content}>
  52. <div className={s.subTitle}>{t('explore.appCustomize.subTitle')}</div>
  53. <div className='flex items-center justify-between space-x-3'>
  54. <AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.icon} background={emoji.icon_background} />
  55. <input
  56. value={name}
  57. onChange={e => setName(e.target.value)}
  58. className='h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg grow'
  59. />
  60. </div>
  61. </div>
  62. <div className='flex flex-row-reverse'>
  63. <Button className='w-24 ml-2' type='primary' onClick={submit}>{t('common.operation.create')}</Button>
  64. <Button className='w-24' onClick={onHide}>{t('common.operation.cancel')}</Button>
  65. </div>
  66. </Modal>
  67. {showEmojiPicker && <EmojiPicker
  68. onSelect={(icon, icon_background) => {
  69. console.log(icon, icon_background)
  70. setEmoji({ icon, icon_background })
  71. setShowEmojiPicker(false)
  72. }}
  73. onClose={() => {
  74. setEmoji({ icon: '🤖', icon_background: '#FFEAD5' })
  75. setShowEmojiPicker(false)
  76. }}
  77. />}
  78. </>
  79. )
  80. }
  81. export default CreateAppModal