CreateNotebookDialog.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import React, { useState } from 'react'
  2. import { X, Plus } from 'lucide-react'
  3. import { CreateGroupData } from '../types'
  4. import { useLanguage } from '../contexts/LanguageContext'
  5. interface CreateNotebookDialogProps {
  6. isOpen: boolean
  7. onClose: () => void
  8. onCreate: (data: CreateGroupData) => Promise<void>
  9. }
  10. export const CreateNotebookDialog: React.FC<CreateNotebookDialogProps> = ({
  11. isOpen,
  12. onClose,
  13. onCreate,
  14. }) => {
  15. const { t } = useLanguage();
  16. const [name, setName] = useState('')
  17. const [description, setDescription] = useState('')
  18. const [intro, setIntro] = useState('')
  19. const [isSubmitting, setIsSubmitting] = useState(false)
  20. if (!isOpen) return null
  21. const handleSubmit = async (e: React.FormEvent) => {
  22. e.preventDefault()
  23. if (!name.trim()) return
  24. try {
  25. setIsSubmitting(true)
  26. await onCreate({
  27. name: name.trim(),
  28. description: description.trim(),
  29. intro: intro.trim(),
  30. color: '#3b82f6', // Default color
  31. })
  32. // Reset form
  33. setName('')
  34. setDescription('')
  35. setIntro('')
  36. onClose()
  37. } catch (error) {
  38. console.error('Failed to create notebook:', error)
  39. alert(t('creationFailed'))
  40. } finally {
  41. setIsSubmitting(false)
  42. }
  43. }
  44. return (
  45. <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm">
  46. <div className="bg-white rounded-xl shadow-xl w-full max-w-lg overflow-hidden animate-in fade-in zoom-in duration-200">
  47. <div className="flex justify-between items-center px-6 py-4 border-b">
  48. <h2 className="text-lg font-semibold text-slate-800">{t('createNewNotebook')}</h2>
  49. <button
  50. onClick={onClose}
  51. className="text-slate-400 hover:text-slate-600 transition-colors"
  52. >
  53. <X size={20} />
  54. </button>
  55. </div>
  56. <form onSubmit={handleSubmit} className="p-6 space-y-4">
  57. <div>
  58. <label className="block text-sm font-medium text-slate-700 mb-1">
  59. {t('nameField')} <span className="text-red-500">{t('required')}</span>
  60. </label>
  61. <input
  62. type="text"
  63. value={name}
  64. onChange={(e) => setName(e.target.value)}
  65. className="w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
  66. placeholder={t('exampleResearch')}
  67. required
  68. autoFocus
  69. />
  70. </div>
  71. <div>
  72. <label className="block text-sm font-medium text-slate-700 mb-1">
  73. {t('shortDescriptionField')}
  74. </label>
  75. <input
  76. type="text"
  77. value={description}
  78. onChange={(e) => setDescription(e.target.value)}
  79. className="w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
  80. placeholder={t('describePurpose')}
  81. />
  82. </div>
  83. <div>
  84. <label className="block text-sm font-medium text-slate-700 mb-1">
  85. {t('detailedIntroField')}
  86. </label>
  87. <textarea
  88. value={intro}
  89. onChange={(e) => setIntro(e.target.value)}
  90. className="w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 h-32 resize-none"
  91. placeholder={t('provideBackgroundInfo')}
  92. />
  93. </div>
  94. <div className="flex justify-end pt-2">
  95. <button
  96. type="button"
  97. onClick={onClose}
  98. className="px-4 py-2 text-slate-600 hover:bg-slate-100 rounded-lg mr-2 transition-colors"
  99. >
  100. {t('cancel')}
  101. </button>
  102. <button
  103. type="submit"
  104. disabled={isSubmitting || !name.trim()}
  105. className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
  106. >
  107. <Plus size={18} />
  108. {isSubmitting ? t('creating') : t('createNow')}
  109. </button>
  110. </div>
  111. </form>
  112. </div>
  113. </div>
  114. )
  115. }