diff --git a/routes.js b/routes.js index e0ce46e..33bfe53 100644 --- a/routes.js +++ b/routes.js @@ -1640,12 +1640,19 @@ module.exports = (app, redis, fetch, RedditAPI) => { app.post('/export_prefs', (req, res, next) => { let export_saved = req.body.export_saved let export_data = req.cookies + let export_to_file = req.body.export_to_file if(export_saved !== 'on') { if(req.cookies.saved) delete export_data.saved } + if(export_to_file === 'on') { + res.setHeader('Content-disposition', 'attachment; filename=teddit_prefs.json') + res.setHeader('Content-type', 'application/json') + res.send(req.cookies) + } + let r = `${(Math.random().toString(36)+'00000000000000000').slice(2, 10+2).toUpperCase()}` let key = `prefs_key:${r}` redis.set(key, JSON.stringify(req.cookies), (error) => { @@ -1657,6 +1664,29 @@ module.exports = (app, redis, fetch, RedditAPI) => { } }) }) + + app.post('/import_prefs', (req, res, next) => { + let body = '' + req.on('data', chunk => { + body += chunk.toString() + }) + req.on('end', () => { + body = body.toString() + let json = body.split('Content-Type: application/json')[1].trim().split('--')[0] + try { + let prefs = JSON.parse(json) + resetPreferences(res) + for(var setting in prefs) { + if(prefs.hasOwnProperty(setting)) { + res.cookie(setting, prefs[setting], { maxAge: 365 * 24 * 60 * 60 * 1000, httpOnly: true }) + } + } + return res.redirect('/preferences') + } catch(e) { + console.error(`Error importing preferences from a JSON file. Please report this error on https://codeberg.org/teddit/teddit.`, e) + } + }) + }) app.post('/r/:subreddit/comments/:id/:snippet', (req, res, next) => { /* morechildren route */ @@ -1736,5 +1766,16 @@ module.exports = (app, redis, fetch, RedditAPI) => { }) } }) + + function resetPreferences(res) { + res.clearCookie('theme') + res.clearCookie('flairs') + res.clearCookie('nsfw_enabled') + res.clearCookie('highlight_controversial') + res.clearCookie('post_media_max_height') + res.clearCookie('collapse_child_comments') + res.clearCookie('show_upvoted_percentage') + res.clearCookie('subbed_subreddits') + } } diff --git a/static/css/styles.css b/static/css/styles.css index 78b4109..060804c 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -150,12 +150,15 @@ form .setting { margin: 10px 0; width: 100%; } -#export-form { +.export-import-form { margin: 60px 0px 0px 0px; } -#export-form input { +.export-import-form input { margin: 10px 0px 10px 0px; } +.export-import-form:last-child { + margin: 25px 0px 15px 0px; +} .container .content small.notice { padding-top: 20px; padding-bottom: 5px; diff --git a/views/preferences.pug b/views/preferences.pug index b893a0b..1321155 100644 --- a/views/preferences.pug +++ b/views/preferences.pug @@ -93,7 +93,7 @@ html small(class="notice") Preferences are stored client-side using cookies without any personal information. input(type="submit", value="Save preferences") a(href="/resetprefs", class="btn") Reset preferences - form(action="/export_prefs", method="POST", id="export-form") + form(action="/export_prefs", method="POST", class="export-import-form") if preferences_key details(open) summary @@ -118,8 +118,23 @@ html .setting small By exporting your preferences you can transfer your subscribed subreddits and preferences to another device. Or you could create a bookmark if you tend to delete your cookies frequently. br + small If you are exporting to a file, please save your preferences first! + br label(for="export_saved") Export saved posts: input(type="checkbox", name="export_saved", id="export_saved") br + label(for="export_to_file") Export preferences to a JSON file: + input(type="checkbox", name="export_to_file", id="export_to_file") + br input(type="submit", value="Export preferences") + form(action="/import_prefs", method="POST", class="export-import-form", enctype="multipart/form-data") + details + summary + span Import JSON preferences file + .setting + small All your current preferences and saved posts will be reseted and the settings from the JSON file will be used instead. + br + input(type="file", name="file", id="file") + br + input(type="submit", value="Import preferences") include includes/footer.pug