dyomedea/src/components/gpx-import/GpxImportSingleFile.tsx

155 lines
4.0 KiB
TypeScript
Raw Normal View History

import { useI18n } from '@solid-primitives/i18n';
import {
FormControlLabel,
Grid,
Typography,
Switch,
FormGroup,
RadioGroup,
Radio,
Divider,
FormControl,
FormLabel,
2022-12-13 06:59:28 +00:00
Card,
CardContent,
CardActions,
CardHeader,
Button,
} from '@suid/material';
import { Component, createEffect, createSignal, Show } from 'solid-js';
import { findStartTime } from '../../lib/gpx';
import GPX from '../../lib/gpx-parser-builder/src/gpx';
interface Props {
gpxFile: File;
}
interface StatsAndGpx {
gpx: Gpx;
stats: any;
}
const analyzeGpx = (gpx: Gpx | undefined) => {
if (gpx === undefined) {
return {};
}
const stats = {
creator: gpx.$.creator,
nbWpts: gpx.wpt ? gpx.wpt?.length : 0,
nbRtes: gpx.rte ? gpx.rte?.length : 0,
nbTrks: gpx.trk ? gpx.trk?.length : 0,
trkMaybeRte:
gpx.trk &&
gpx.trk[0].trkseg &&
gpx.trk[0].trkseg[0] &&
gpx.trk[0].trkseg[0].trkpt &&
!gpx.trk[0].trkseg[0].trkpt[0].time,
startTime: findStartTime(gpx),
};
return stats;
};
const GpxImportSingleFile: Component<Props> = ({ gpxFile }) => {
const [t] = useI18n();
const [statsAndGpx, setStatsAndGpx] = createSignal<StatsAndGpx>();
2022-12-13 06:59:28 +00:00
const [state, setState] = createSignal('init');
const gpxReader = new FileReader();
gpxReader.readAsText(gpxFile);
gpxReader.addEventListener(
'load',
async () => {
// this will then display a text gpxfile
console.log({
caller: 'GpxImportSingleFile / XML',
gpxFile,
result: gpxReader.result,
});
const gpx = GPX.parse(gpxReader.result);
console.log({ caller: 'GpxImportSingleFile / JSON', gpxFile, gpx });
setStatsAndGpx({ gpx, stats: analyzeGpx(gpx) });
// if (gpx) {
// const startTime = new Date(findStartTime(gpx)!);
// }
},
false
);
2022-12-13 06:59:28 +00:00
const doImport = () => {
setState('imported');
};
const [selectedTrkTransform, setSelectedTrkTransform] = createSignal(
'importNonTimedTrksAsRtes'
);
const handleTrkTransformChange = (event: any) => {
setSelectedTrkTransform(event.target.value);
};
const controlTrkTransformProps = (item: string) => ({
checked: selectedTrkTransform() === item,
onChange: handleTrkTransformChange,
value: item,
name: 'trkTransform',
label: t(item),
inputProps: { 'aria-label': item },
});
return (
2022-12-13 06:59:28 +00:00
<Card raised>
<CardContent>
<Typography variant='h6'>
{t('file')}
{gpxFile.name}
</Typography>
2022-12-13 06:59:28 +00:00
</CardContent>
<CardContent>
<Show when={statsAndGpx() !== undefined}>
<Typography variant='body1'>
{t('gpxStats', statsAndGpx().stats)}{' '}
{statsAndGpx()?.stats.startTime
? t('gpxStartTime', statsAndGpx().stats)
: t('gpxNoStartTime')}
</Typography>
2022-12-13 06:59:28 +00:00
<Show when={statsAndGpx().stats.trkMaybeRte}>
<Typography variant='body1'>{t('trkMaybeRte')}</Typography>
2022-12-13 06:59:28 +00:00
</Show>
{/* <Show when={statsAndGpx().stats.nbTrks > 0}>
<FormControl fullWidth>
<FormLabel>{t('importTrk')}</FormLabel>
<RadioGroup>
<FormControlLabel
control={<Radio color='success' />}
{...controlTrkTransformProps('importNonTimedTrksAsRtes')}
/>
<FormControlLabel
control={<Radio color='secondary' />}
{...controlTrkTransformProps('importAllTrksAsRtes')}
/>
<FormControlLabel
control={<Radio color='error' />}
{...controlTrkTransformProps('importTrksAsTrks')}
/>
</RadioGroup>
</FormControl>
2022-12-13 06:59:28 +00:00
</Show> */}
</Show>
2022-12-13 06:59:28 +00:00
<CardActions>
<Button
variant='contained'
disabled={state() != 'init'}
onClick={doImport}
>
{t('import')}
</Button>
</CardActions>
</CardContent>
</Card>
);
};
export default GpxImportSingleFile;