refs #2500 Fix account preferences

This commit is contained in:
AkiraFukushima 2023-01-13 01:06:51 +09:00
parent 0adc0dd8ac
commit 47e2b1b8e8
No known key found for this signature in database
GPG Key ID: B6E51BAC4DE1A957
4 changed files with 86 additions and 45 deletions

View File

@ -184,19 +184,22 @@ export const removeAllAccounts = (db: sqlite3.Database): Promise<null> => {
})
}
export const forwardAccount = (db: sqlite3.Database, account: LocalAccount): Promise<LocalAccount> => {
export const forwardAccount = (db: sqlite3.Database, id: number): Promise<null> => {
return new Promise((resolve, reject) => {
db.serialize(() => {
db.run('BEGIN TRANSACTION')
db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => {
if (err) {
reject(err)
}
const index = rows.findIndex(r => r.id === account.id)
if (index < 0 || index >= rows.length) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return resolve(account)
return reject(err)
}
const index = rows.findIndex(r => r.id === id)
if (index < 0 || index >= rows.length - 1) {
db.run('ROLLBACK TRANSACTION')
return resolve(null)
}
const target = rows[index + 1]
const base = rows[index]
@ -204,24 +207,26 @@ export const forwardAccount = (db: sqlite3.Database, account: LocalAccount): Pro
db.serialize(() => {
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
db.run('COMMIT')
resolve(
Object.assign(account, {
order: target.sort
})
)
return resolve(null)
})
})
})
@ -229,18 +234,22 @@ export const forwardAccount = (db: sqlite3.Database, account: LocalAccount): Pro
})
}
export const backwardAccount = (db: sqlite3.Database, account: LocalAccount): Promise<LocalAccount> => {
export const backwardAccount = (db: sqlite3.Database, id: number): Promise<null> => {
return new Promise((resolve, reject) => {
db.serialize(() => {
db.run('BEGIN TRANSACTION')
db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
const index = rows.findIndex(r => r.id === account.id)
const index = rows.findIndex(r => r.id === id)
if (index < 1) {
return resolve(account)
db.run('ROLLBACK TRANSACTION')
return resolve(null)
}
const target = rows[index - 1]
const base = rows[index]
@ -248,25 +257,26 @@ export const backwardAccount = (db: sqlite3.Database, account: LocalAccount): Pr
db.serialize(() => {
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
reject(err)
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => {
if (err) {
reject(err)
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
db.run('COMMIT')
resolve(
Object.assign(account, {
order: target.sort
})
)
return resolve(null)
})
})
})

View File

@ -522,12 +522,12 @@ ipcMain.handle('remove-account', async (_: IpcMainInvokeEvent, id: number) => {
}
})
ipcMain.handle('forward-account', async (_: IpcMainInvokeEvent, acct: LocalAccount) => {
await forwardAccount(db, acct)
ipcMain.handle('forward-account', async (_: IpcMainInvokeEvent, id: number) => {
await forwardAccount(db, id)
})
ipcMain.handle('backward-account', async (_: IpcMainInvokeEvent, acct: LocalAccount) => {
await backwardAccount(db, acct)
ipcMain.handle('backward-account', async (_: IpcMainInvokeEvent, id: number) => {
await backwardAccount(db, id)
})
ipcMain.handle('remove-all-accounts', async (_: IpcMainInvokeEvent) => {

View File

@ -16,7 +16,16 @@
<el-table-column prop="domain" :label="$t('preferences.account.domain')"> </el-table-column>
<el-table-column :label="$t('preferences.account.association')">
<template #default="scope">
<el-button class="action" link @click.prevent="removeAccount(scope.$index, accounts)">
<el-button
class="action"
link
@click.prevent="
removeAccount(
scope.$index,
accounts.map(a => a.id)
)
"
>
<font-awesome-icon icon="xmark" />
{{ $t('preferences.account.remove_association') }}
</el-button>
@ -25,12 +34,30 @@
<el-table-column :label="$t('preferences.account.order')" width="60">
<template #default="scope">
<div class="allow-up">
<el-button class="arrow-up action" link @click.prevent="forward(scope.$index, accounts)">
<el-button
class="arrow-up action"
link
@click.prevent="
backward(
scope.$index,
accounts.map(a => a.id)
)
"
>
<font-awesome-icon icon="arrow-up" />
</el-button>
</div>
<div class="allow-down">
<el-button class="arrow-down action" link @click.prevent="backward(scope.$index, accounts)">
<el-button
class="arrow-down action"
link
@click.prevent="
forward(
scope.$index,
accounts.map(a => a.id)
)
"
>
<font-awesome-icon icon="arrow-down" />
</el-button>
</div>
@ -61,7 +88,6 @@ import { useRouter } from 'vue-router'
import { useStore } from '@/store'
import { ACTION_TYPES, MUTATION_TYPES } from '@/store/Preferences/Account'
import { ElMessage } from 'element-plus'
import { LocalAccount } from '~/src/types/localAccount'
export default defineComponent({
name: 'account',
@ -71,7 +97,13 @@ export default defineComponent({
const i18n = useI18next()
const router = useRouter()
const accounts = computed(() => store.state.Preferences.Account.accounts)
const accounts = computed(() =>
store.state.Preferences.Account.accounts.map(([a, s]) => ({
id: a.id,
username: a.username,
domain: s.domain
}))
)
const accountLoading = computed(() => store.state.Preferences.Account.accountLoading)
const backgroundColor = computed(() => store.state.App.theme.background_color)
@ -93,7 +125,7 @@ export default defineComponent({
}
}
const removeAccount = (index: number, accounts: Array<LocalAccount>) => {
const removeAccount = (index: number, accounts: Array<number>) => {
store
.dispatch(`${space}/${ACTION_TYPES.REMOVE_ACCOUNT}`, accounts[index])
.then(() => {
@ -107,13 +139,13 @@ export default defineComponent({
})
}
const forward = (index: number, accounts: Array<LocalAccount>) => {
const forward = (index: number, accounts: Array<number>) => {
store.dispatch(`${space}/${ACTION_TYPES.FORWARD_ACCOUNT}`, accounts[index]).then(() => {
loadAccounts()
})
}
const backward = (index: number, accounts: Array<LocalAccount>) => {
const backward = (index: number, accounts: Array<number>) => {
store.dispatch(`${space}/${ACTION_TYPES.BACKWARD_ACCOUNT}`, accounts[index]).then(() => {
loadAccounts()
})

View File

@ -1,5 +1,4 @@
import { Module, MutationTree, ActionTree } from 'vuex'
import { toRaw } from 'vue'
import { LocalAccount } from '~/src/types/localAccount'
import { RootState } from '@/store'
import { MyWindow } from '~/src/types/global'
@ -45,14 +44,14 @@ const actions: ActionTree<AccountState, RootState> = {
commit(MUTATION_TYPES.UPDATE_ACCOUNTS, accounts)
return accounts
},
[ACTION_TYPES.REMOVE_ACCOUNT]: async (_, account: LocalAccount) => {
await win.ipcRenderer.invoke('remove-account', account.id)
[ACTION_TYPES.REMOVE_ACCOUNT]: async (_, id: number) => {
await win.ipcRenderer.invoke('remove-account', id)
},
[ACTION_TYPES.FORWARD_ACCOUNT]: async (_, account: LocalAccount) => {
await win.ipcRenderer.invoke('forward-account', toRaw(account))
[ACTION_TYPES.FORWARD_ACCOUNT]: async (_, id: number) => {
await win.ipcRenderer.invoke('forward-account', id)
},
[ACTION_TYPES.BACKWARD_ACCOUNT]: async (_, account: LocalAccount) => {
await win.ipcRenderer.invoke('backward-account', toRaw(account))
[ACTION_TYPES.BACKWARD_ACCOUNT]: async (_, id: number) => {
await win.ipcRenderer.invoke('backward-account', id)
},
[ACTION_TYPES.REMOVE_ALL_ACCOUNTS]: async () => {
await win.ipcRenderer.invoke('remove-all-accounts')