1
0
mirror of https://github.com/comatory/fb2iCal synced 2025-06-05 22:09:25 +02:00

feature: convert form input to Svelte component and create module for

fetching event data & parsing it
This commit is contained in:
Ondřej Synáček
2020-12-20 13:50:12 +01:00
parent 128b03344b
commit b28995aa1e
10 changed files with 182 additions and 166 deletions

View File

@@ -21,19 +21,6 @@ import { Request } from '../frontend/records'
document.addEventListener('DOMContentLoaded', boot)
const createRecord = (uri, summary, startTime) => {
const id = uuidv4()
const createdAt = new Date()
saveRecord({
id,
link: uri,
createdAt,
startTime,
title: summary,
})
}
const configureLogger = (logger) => {
if (!logger) {
return
@@ -53,23 +40,6 @@ import { Request } from '../frontend/records'
})
}
const setStatusDownloading = () => {
clearStatuses()
document.querySelector('#network').classList.add('show')
}
const setStatusParsing = () => {
clearStatuses()
document.querySelector('#parsing').classList.add('show')
}
const setStatusError = (err) => {
clearStatuses()
const error = document.querySelector('#error')
error.innerText = err.toString()
error.classList.add('show')
}
const setServiceWorkerStatus = (status) => {
clearStatuses()
const sw = document.querySelector('#service-worker')
@@ -77,59 +47,6 @@ import { Request } from '../frontend/records'
status ? sw.classList.add('show') : sw.classList.remove('show')
}
const pendingRequest = () => {
input.disabled = true
submitButton.disabled = true
setStatusDownloading()
requestStore.set(new Request({
id: uuidv4(),
error: null,
}))
}
const finishedRequest = () => {
input.disabled = false
submitButton.disabled = false
clearStatuses()
requestStore.set(null)
}
const handleError = (error) => {
finishedRequest()
setStatusError(error)
requestStore.update((prevRequest) => {
prevRequest.error = error
return prevRequest
})
}
const postURL = (data) => {
return new Promise((resolve, reject) => {
fetch('/download/html/', {
method: 'POST',
headers: {
'Accept': 'text/html, application/json',
'Content-Type': 'application/x-www-form-urlencoded',
},
body: data,
}).then((response) => {
if (response.status !== 200) {
if (response.body.constructor === ReadableStream) {
response.json().then((json) => reject(json.error || response.statusText))
return
}
reject(response.statusText)
return
}
finishedRequest()
resolve(response)
}).catch(reject)
})
}
const form = document.querySelector('form')
const submitButton = document.querySelector("#submit")
const input = document.querySelector("#url")
@@ -170,65 +87,4 @@ import { Request } from '../frontend/records'
}
configureLogger(logger)
const handleHTMLResponse = (html, url) => {
try {
setStatusParsing()
const eventData = extractEventDataFromHTML(html, url, { logger })
generateICS(eventData)
.then((text) => {
const dataUri = encodeURIComponent(text)
const uri = `data:text/calendar;charset=utf-8,${dataUri}`
link.setAttribute('href', uri)
link.setAttribute('download', 'download.ics')
link.click()
input.value = ''
const summaryMatch = text.match(/SUMMARY:.*/)[0]
const summary = summaryMatch ? summaryMatch.replace(/SUMMARY:/, '') : ''
const startTimeMatches = text.match(/DTSTART:.*/)
const startTimeMatch = text.length > 0 ?
(startTimeMatches[0] || '').replace(/DTSTART:/, '') :
''
const startTime = parseStartTimeFromiCalString(startTimeMatch)
createRecord(uri, summary, startTime)
clearStatuses()
})
.catch((err) => {
handleError(err)
})
} catch (err) {
handleError(err)
}
}
submitButton.addEventListener('click', (event) => {
if (!form.reportValidity()) {
return
}
event.preventDefault()
const formData = new URLSearchParams()
formData.set('url', input.value)
pendingRequest()
postURL(formData)
.then((res) => {
res.text()
.then((response) => handleHTMLResponse(response, input.value))
.catch((err) => {
handleError(err)
})
})
.catch((err) => {
handleError(err)
})
})
})()