cadfa70e60
* #708 apply strictier linting rules and fix simple eslint bugs * #708 fix eslint errors relate to promise * #708 fix eslint import/no-extraneous-dependencies * #708 fix eslint errors of react-hook * #708 enable eslint check for typescript --------- Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
149 lines
4.1 KiB
TypeScript
149 lines
4.1 KiB
TypeScript
import { useAppSelector } from '@/app/hooks'
|
|
import { extractEventBaseUuid } from '@/utils/extractEventBaseUuid'
|
|
import {
|
|
Box,
|
|
Button,
|
|
FormControl,
|
|
InputLabel,
|
|
MenuItem,
|
|
Select,
|
|
TextField,
|
|
Typography
|
|
} from '@linagora/twake-mui'
|
|
import { useEffect, useState } from 'react'
|
|
import { useI18n } from 'twake-i18n'
|
|
import { CalendarItemList } from './CalendarItemList'
|
|
import { SettingsTab } from './SettingsTab'
|
|
|
|
export function ImportTab({
|
|
userId,
|
|
importTarget,
|
|
setImportTarget,
|
|
setImportedContent,
|
|
newCalParams
|
|
}: {
|
|
userId: string
|
|
importTarget: string
|
|
setImportTarget: (target: string) => void
|
|
setImportedContent: (content: File | null) => void
|
|
newCalParams: {
|
|
name: string
|
|
setName: (name: string) => void
|
|
description: string
|
|
setDescription: (d: string) => void
|
|
color: Record<string, string>
|
|
setColor: (color: Record<string, string>) => void
|
|
visibility: 'public' | 'private'
|
|
setVisibility: (visibility: 'public' | 'private') => void
|
|
}
|
|
}) {
|
|
const { t } = useI18n()
|
|
const [importMode] = useState<'file' | 'url'>('file')
|
|
const [importFile, setImportFile] = useState<File | null>(null)
|
|
const [importUrl, setImportUrl] = useState('')
|
|
const calendars = useAppSelector(state => state.calendars.list)
|
|
const personalCalendars = Object.values(calendars).filter(
|
|
cal => extractEventBaseUuid(cal.id) === userId
|
|
)
|
|
|
|
useEffect(() => {
|
|
setImportedContent(importMode === 'file' ? importFile : null)
|
|
}, [importFile, importUrl, importMode, setImportedContent])
|
|
|
|
return (
|
|
<>
|
|
{/* Form group 1: Select file button - first group, margin top 0 */}
|
|
{importMode === 'file' && (
|
|
<Box mt={0}>
|
|
<Button
|
|
variant="outlined"
|
|
component="label"
|
|
size="medium"
|
|
sx={{ borderRadius: '12px' }}
|
|
>
|
|
{t('common.select_file')}
|
|
<input
|
|
type="file"
|
|
hidden
|
|
accept=".ics"
|
|
onChange={e => setImportFile(e.target.files?.[0] ?? null)}
|
|
/>
|
|
</Button>
|
|
{importFile && (
|
|
<Typography
|
|
variant="body2"
|
|
color="text.secondary"
|
|
sx={{ marginTop: '6px' }}
|
|
>
|
|
{importFile.name}
|
|
</Typography>
|
|
)}
|
|
<Typography
|
|
variant="caption"
|
|
color="text.secondary"
|
|
display="block"
|
|
sx={{ marginTop: '6px' }}
|
|
>
|
|
{t('calendar.import_file_description')}
|
|
</Typography>
|
|
</Box>
|
|
)}
|
|
|
|
{/* Form group 2: URL field */}
|
|
{importMode === 'url' && (
|
|
<Box mt={0}>
|
|
<TextField
|
|
fullWidth
|
|
label={t('calendar.ics_feed_url')}
|
|
value={importUrl}
|
|
onChange={e => setImportUrl(e.target.value)}
|
|
size="small"
|
|
margin="dense"
|
|
sx={{
|
|
'&.MuiFormControl-root.MuiFormControl-marginDense': {
|
|
marginTop: '6px',
|
|
marginBottom: 0
|
|
}
|
|
}}
|
|
/>
|
|
</Box>
|
|
)}
|
|
|
|
{/* Form group 3: Import to */}
|
|
<Box mt={2}>
|
|
<FormControl
|
|
fullWidth
|
|
size="small"
|
|
margin="dense"
|
|
sx={{
|
|
'&.MuiFormControl-root.MuiFormControl-marginDense': {
|
|
marginTop: '6px',
|
|
marginBottom: 0
|
|
}
|
|
}}
|
|
>
|
|
<InputLabel id="import-to-label">
|
|
{t('calendar.import_to')}
|
|
</InputLabel>
|
|
<Select
|
|
labelId="import-to-label"
|
|
label={t('calendar.import_to')}
|
|
value={importTarget}
|
|
onChange={e => setImportTarget(e.target.value)}
|
|
>
|
|
<MenuItem value="new">{t('calendar.new_calendar')}</MenuItem>
|
|
{CalendarItemList(personalCalendars)}
|
|
</Select>
|
|
</FormControl>
|
|
</Box>
|
|
|
|
{/* Form group 4: SettingsTab (when importing to new calendar) */}
|
|
{importTarget === 'new' && (
|
|
<Box mt={2}>
|
|
<SettingsTab {...newCalParams} />
|
|
</Box>
|
|
)}
|
|
</>
|
|
)
|
|
}
|