elk/pages/settings/users/index.vue

90 lines
2.8 KiB
Vue
Raw Normal View History

2022-12-27 23:14:55 +03:00
<script lang="ts" setup>
import { fileOpen } from 'browser-fs-access'
2022-12-27 23:14:55 +03:00
import type { UserLogin } from '~/types'
2023-01-04 16:57:12 +03:00
const { t } = useI18n()
useHeadFixed({
title: () => `${t('settings.users.label')} | ${t('nav.settings')}`,
})
2022-12-27 23:14:55 +03:00
const loggedInUsers = useUsers()
async function exportTokens() {
if (!confirm('Please aware that the tokens represent the **full access** to your accounts, and should be treated as sensitive information. Are you sure you want to export the tokens?'))
return
const { saveAs } = await import('file-saver')
const data = {
'/': 'Generated by Elk, you can import it to Elk to restore the tokens.',
'//': 'This file represents the **full access** to your accounts, and should be treated as sensitive information.',
'version': 1,
'origin': location.origin,
'users': loggedInUsers.value,
}
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json;charset=utf-8' })
saveAs(blob, `elk-users-tokens-${new Date().toISOString().slice(0, 10)}.json`)
}
async function importTokens() {
const file = await fileOpen({
description: 'Token File',
mimeTypes: ['application/json'],
})
2022-12-27 23:14:55 +03:00
try {
const content = await file.text()
const data = JSON.parse(content)
if (data.version !== 1)
throw new Error('Invalid version')
const users = data.users as UserLogin[]
const newUsers: UserLogin[] = []
for (const user of users) {
2023-01-03 05:29:58 +03:00
if (loggedInUsers.value.some(u => isSameUser(u, user)))
continue
newUsers.push(user)
2022-12-27 23:14:55 +03:00
}
if (newUsers.length === 0) {
alert('No new users found')
return
2022-12-27 23:14:55 +03:00
}
if (!confirm(`Found ${newUsers.length} new users, are you sure you want to import them?`))
return
loggedInUsers.value = [...loggedInUsers.value, ...newUsers]
}
catch (e) {
console.error(e)
alert('Invalid Elk tokens file')
}
2022-12-27 23:14:55 +03:00
}
</script>
<template>
<MainContent back-on-small-screen>
2022-12-27 23:14:55 +03:00
<template #title>
<div text-lg font-bold flex items-center gap-2 @click="$scrollToTop">
<span>{{ $t('settings.users.label') }}</span>
</div>
</template>
<div p6>
2022-12-27 23:21:53 +03:00
<template v-if="loggedInUsers.length">
<div flex="~ col gap2">
2023-01-03 05:29:58 +03:00
<div v-for="user of loggedInUsers" :key="getUniqueUserId(user)">
<AccountInfo v-if="!user.guest" :account="user.account" :hover-card="false" />
2023-01-03 12:39:00 +03:00
<AccountGuest v-else :user="user" />
2022-12-27 23:21:53 +03:00
</div>
2022-12-27 23:14:55 +03:00
</div>
2022-12-27 23:21:53 +03:00
<div my4 border="t base" />
<button btn-text flex="~ gap-2" items-center @click="exportTokens">
<div i-ri-download-2-line />
2022-12-29 22:27:11 +03:00
{{ $t('settings.users.export') }}
2022-12-27 23:21:53 +03:00
</button>
</template>
2022-12-27 23:14:55 +03:00
<button btn-text flex="~ gap-2" items-center @click="importTokens">
<div i-ri-upload-2-line />
2022-12-29 22:27:11 +03:00
{{ $t('settings.users.import') }}
2022-12-27 23:14:55 +03:00
</button>
</div>
</MainContent>
</template>