2022-12-27 23:14:55 +03:00
< script lang = "ts" setup >
2023-01-12 01:24:00 +03:00
/* eslint-disable no-alert */
2022-12-29 22:44:51 +03:00
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 ( )
2023-04-16 22:33:51 +03:00
useHydratedHead ( {
2023-01-04 16:57:12 +03:00
title : ( ) => ` ${ t ( 'settings.users.label' ) } | ${ t ( 'nav.settings' ) } ` ,
} )
2022-12-27 23:14:55 +03:00
const loggedInUsers = useUsers ( )
async function exportTokens ( ) {
2023-02-06 12:34:50 +03:00
if ( process . server )
return
2022-12-27 23:14:55 +03:00
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 ( ) {
2023-02-06 12:34:50 +03:00
if ( process . server )
return
2022-12-29 22:44:51 +03:00
const file = await fileOpen ( {
description : 'Token File' ,
mimeTypes : [ 'application/json' ] ,
} )
2022-12-27 23:14:55 +03:00
2022-12-29 22:44:51 +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 ) {
if ( loggedInUsers . value . some ( u => u . server === user . server && u . account . id === user . account . id ) )
continue
newUsers . push ( user )
2022-12-27 23:14:55 +03:00
}
2022-12-29 22:44:51 +03:00
if ( newUsers . length === 0 ) {
alert ( 'No new users found' )
return
2022-12-27 23:14:55 +03:00
}
2022-12-29 22:44:51 +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 >
2022-12-28 04:12:56 +03:00
< 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 >
2022-12-28 02:03:50 +03:00
< div p6 >
2022-12-27 23:21:53 +03:00
< template v-if = "loggedInUsers.length" >
< div flex = "~ col gap2" >
< div v-for = "user of loggedInUsers" :key="user.account.id" >
< AccountInfo :account = "user.account" :hover-card = "false" / >
< / 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 >