mirror of
https://wget.la/https://github.com/Wxw-Gu/WechatExplorer
synced 2026-08-17 19:47:08 +08:00
fix: 修复登录报错key问题
This commit is contained in:
@@ -624,6 +624,25 @@ function App(): React.ReactElement {
|
||||
setDbKeyStatusKind('normal')
|
||||
}
|
||||
|
||||
const handleReturnToLogin = (): void => {
|
||||
setIsAuthenticated(false)
|
||||
setIsDatabaseConnected(false)
|
||||
setBootState('login')
|
||||
setActivePage('archive')
|
||||
setSettingsCategory('database-key')
|
||||
setSelectedContact(null)
|
||||
setMessages([])
|
||||
setContacts([])
|
||||
setFilteredContacts([])
|
||||
setSelfInfo(null)
|
||||
setIsMessagesLoading(false)
|
||||
setIsNativeMonitorActive(false)
|
||||
setReportNotice('')
|
||||
setDbKeyStatus('已断开当前连接,可重新输入或获取数据库密钥')
|
||||
setDbKeyStatusKind('normal')
|
||||
setStartupProgress(null)
|
||||
}
|
||||
|
||||
const getDateRangeParams = (
|
||||
range: string
|
||||
): { startTime: number | undefined; endTime: number | undefined } => {
|
||||
@@ -1140,6 +1159,7 @@ function App(): React.ReactElement {
|
||||
onSelfInfoChange={setSelfInfo}
|
||||
onContactsChange={setContacts}
|
||||
onFilteredContactsChange={setFilteredContacts}
|
||||
onReturnToLogin={handleReturnToLogin}
|
||||
onAIRuntimeChange={(config: AIRuntimeModelConfig) => setAiModelConfig(config)}
|
||||
onNotice={setReportNotice}
|
||||
onOpenSettings={openSettings}
|
||||
|
||||
@@ -3825,7 +3825,7 @@ body {
|
||||
.database-key-auto-error { display:grid; gap:4px; margin-top:16px; padding:12px 14px; border-left:3px solid #c68635; background:#fff8ec; color:#79501f; font-size:12px; }.database-key-auto-error span { overflow-wrap:anywhere; }.database-key-auto-error p { color:#79501f; }.database-key-auto-error button { justify-self:start; border:0; padding:4px 0; background:transparent; color:#247a63; cursor:pointer; font:600 12px inherit; }
|
||||
.database-key-security-info { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:1px; overflow:hidden; border:1px solid #e3e8e5; border-radius:9px; background:#e3e8e5; }.database-key-security-info span { display:grid; gap:6px; padding:15px; background:#f5f7f6; color:#66706b; font-size:12px; line-height:1.5; }.database-key-security-info strong { color:#35403b; font-size:13px; }
|
||||
.database-key-diagnostics { margin-top:22px; border:1px solid #dde3e0; border-radius:9px; background:#fff; }.database-key-diagnostics summary { padding:14px 16px; color:#46514c; cursor:pointer; font-size:13px; font-weight:600; }.database-key-diagnostics dl { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px 28px; margin:0; padding:2px 16px 16px; }.database-key-diagnostics button { margin:0 16px 16px; border:0; padding:0; background:transparent; color:#247a63; cursor:pointer; font:600 12px inherit; }
|
||||
.database-key-danger { margin-top:30px; padding-bottom:1px; }.database-key-danger>h2 { margin:0 0 14px; color:#c85a5a; font-size:15px; }.database-key-danger>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #efcdcd; background:#fff7f7; }.database-key-danger>div:first-of-type { border-radius:9px 9px 0 0; }.database-key-danger>div:last-of-type { border-top:0; border-radius:0 0 9px 9px; }.database-key-danger span { display:grid; gap:4px; }.database-key-danger strong { color:#4a3c3c; font-size:13px; }.database-key-danger small { color:#786868; font-size:12px; }.database-key-danger button { min-height:34px; flex:0 0 auto; border:1px solid #e8baba; border-radius:8px; padding:0 13px; background:#fff; color:#c85a5a; cursor:pointer; }.database-key-danger button:disabled { cursor:not-allowed; opacity:.45; }
|
||||
.database-key-connection-actions { margin-top:30px; }.database-key-connection-actions>h2 { margin:0 0 14px; color:#3d4742; font-size:15px; }.database-key-connection-actions>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #dde3e0; border-radius:9px; background:#fff; }.database-key-connection-actions span { display:grid; gap:4px; }.database-key-connection-actions strong { color:#35403b; font-size:13px; }.database-key-connection-actions small { color:#66706b; font-size:12px; }.database-key-connection-actions button { min-height:34px; flex:0 0 auto; border:1px solid #247a63; border-radius:8px; padding:0 13px; background:#fff; color:#247a63; cursor:pointer; }.database-key-connection-actions button:hover:not(:disabled) { background:#f0f7f4; }.database-key-danger { margin-top:30px; padding-bottom:1px; }.database-key-danger>h2 { margin:0 0 14px; color:#c85a5a; font-size:15px; }.database-key-danger>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #efcdcd; background:#fff7f7; }.database-key-danger>div:first-of-type { border-radius:9px 9px 0 0; }.database-key-danger>div:last-of-type { border-top:0; border-radius:0 0 9px 9px; }.database-key-danger span { display:grid; gap:4px; }.database-key-danger strong { color:#4a3c3c; font-size:13px; }.database-key-danger small { color:#786868; font-size:12px; }.database-key-danger button { min-height:34px; flex:0 0 auto; border:1px solid #e8baba; border-radius:8px; padding:0 13px; background:#fff; color:#c85a5a; cursor:pointer; }.database-key-danger button:disabled { cursor:not-allowed; opacity:.45; }
|
||||
.database-key-confirm-backdrop { position:fixed; z-index:30; inset:0; display:grid; place-items:center; padding:24px; background:rgba(25,32,29,.34); }.database-key-confirm { width:min(100%,430px); padding:22px; border-radius:12px; background:#fff; box-shadow:0 18px 50px rgba(24,35,30,.2); }.database-key-confirm h2 { margin:0; color:#202724; font-size:17px; }.database-key-confirm p { margin:12px 0 22px; color:#66706b; font-size:13px; line-height:1.7; }.database-key-confirm>div { display:flex; justify-content:flex-end; gap:8px; }.database-key-confirm button { min-height:34px; border:1px solid #dde3e0; border-radius:8px; padding:0 14px; background:#fff; color:#46514c; cursor:pointer; }.database-key-confirm button.danger { border-color:#c85a5a; background:#c85a5a; color:#fff; }
|
||||
/* SETTINGS-03: image decryption */
|
||||
.image-decryption-content { padding-bottom:48px; }
|
||||
|
||||
@@ -20,6 +20,7 @@ export function SettingsWorkspace({
|
||||
onSelfInfoChange,
|
||||
onContactsChange,
|
||||
onFilteredContactsChange,
|
||||
onReturnToLogin,
|
||||
onAIRuntimeChange,
|
||||
onNotice,
|
||||
onOpenSettings
|
||||
@@ -34,6 +35,7 @@ export function SettingsWorkspace({
|
||||
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
|
||||
onContactsChange: (contacts: Contact[]) => void
|
||||
onFilteredContactsChange: (contacts: Contact[]) => void
|
||||
onReturnToLogin: () => void
|
||||
onAIRuntimeChange: (config: AIRuntimeModelConfig) => void
|
||||
onNotice: (message: string) => void
|
||||
onOpenSettings: () => void
|
||||
@@ -64,6 +66,7 @@ export function SettingsWorkspace({
|
||||
onSelfInfoChange={onSelfInfoChange}
|
||||
onContactsChange={onContactsChange}
|
||||
onFilteredContactsChange={onFilteredContactsChange}
|
||||
onReturnToLogin={onReturnToLogin}
|
||||
onNotice={onNotice}
|
||||
/>
|
||||
) : selectedCategory === 'image-key' ? (
|
||||
|
||||
@@ -3,15 +3,30 @@ import { useState } from 'react'
|
||||
export function DatabaseKeyDangerZone({
|
||||
disabled,
|
||||
onClear,
|
||||
onReplace
|
||||
onReplace,
|
||||
onReturnToLogin
|
||||
}: {
|
||||
disabled: boolean
|
||||
onClear: () => void
|
||||
onReplace: () => void
|
||||
onReturnToLogin: () => void
|
||||
}): React.ReactElement {
|
||||
const [confirming, setConfirming] = useState(false)
|
||||
const [confirmingReturn, setConfirmingReturn] = useState(false)
|
||||
return (
|
||||
<>
|
||||
<section className="database-key-connection-actions">
|
||||
<h2>连接管理</h2>
|
||||
<div>
|
||||
<span>
|
||||
<strong>返回登录界面</strong>
|
||||
<small>断开当前数据库连接,回到密钥输入界面。不会删除已保存密钥或微信数据。</small>
|
||||
</span>
|
||||
<button type="button" onClick={() => setConfirmingReturn(true)}>
|
||||
返回登录
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
<section className="database-key-danger">
|
||||
<h2>密钥管理</h2>
|
||||
<div>
|
||||
@@ -69,6 +84,41 @@ export function DatabaseKeyDangerZone({
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{confirmingReturn && (
|
||||
<div
|
||||
className="database-key-confirm-backdrop"
|
||||
role="presentation"
|
||||
onMouseDown={() => setConfirmingReturn(false)}
|
||||
>
|
||||
<div
|
||||
className="database-key-confirm"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="database-key-return-confirm-title"
|
||||
onMouseDown={(event) => event.stopPropagation()}
|
||||
>
|
||||
<h2 id="database-key-return-confirm-title">返回登录界面?</h2>
|
||||
<p>
|
||||
WechatExplorer
|
||||
将断开当前数据库连接并回到密钥输入界面。已保存的数据库密钥和微信原始数据不会被删除。
|
||||
</p>
|
||||
<div>
|
||||
<button type="button" onClick={() => setConfirmingReturn(false)}>
|
||||
取消
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => {
|
||||
setConfirmingReturn(false)
|
||||
onReturnToLogin()
|
||||
}}
|
||||
>
|
||||
返回登录
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ export interface DatabaseKeyController {
|
||||
saveKey: () => Promise<void>
|
||||
autoDetectKey: () => Promise<void>
|
||||
clearSavedKey: () => Promise<void>
|
||||
returnToLogin: () => Promise<void>
|
||||
copyDiagnostics: () => Promise<void>
|
||||
refreshEnvironment: () => Promise<void>
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ export function useDatabaseKeyController({
|
||||
onSelfInfoChange,
|
||||
onContactsChange,
|
||||
onFilteredContactsChange,
|
||||
onReturnToLogin,
|
||||
onNotice
|
||||
}: {
|
||||
dbKey: string
|
||||
@@ -24,6 +25,7 @@ export function useDatabaseKeyController({
|
||||
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
|
||||
onContactsChange: (contacts: Contact[]) => void
|
||||
onFilteredContactsChange: (contacts: Contact[]) => void
|
||||
onReturnToLogin: () => void
|
||||
onNotice: (message: string) => void
|
||||
}): DatabaseKeyController {
|
||||
const [state, dispatch] = useReducer(databaseKeyReducer, initialDatabaseKeyState)
|
||||
@@ -188,6 +190,26 @@ export function useDatabaseKeyController({
|
||||
refreshEnvironment
|
||||
])
|
||||
|
||||
const returnToLogin = useCallback(async (): Promise<void> => {
|
||||
const result = await window.api.disconnectDb()
|
||||
if (!result.success) {
|
||||
onNotice(result.error || '断开数据库连接失败')
|
||||
return
|
||||
}
|
||||
onDatabaseConnectionChange(false)
|
||||
onSelfInfoChange(null)
|
||||
onContactsChange([])
|
||||
onFilteredContactsChange([])
|
||||
onReturnToLogin()
|
||||
}, [
|
||||
onContactsChange,
|
||||
onDatabaseConnectionChange,
|
||||
onFilteredContactsChange,
|
||||
onNotice,
|
||||
onReturnToLogin,
|
||||
onSelfInfoChange
|
||||
])
|
||||
|
||||
const copyDiagnostics = useCallback(async (): Promise<void> => {
|
||||
const result = await window.api.copyText(
|
||||
buildDatabaseKeyDiagnostics(state, dbKey, selfInfo, dbReady)
|
||||
@@ -214,6 +236,7 @@ export function useDatabaseKeyController({
|
||||
saveKey,
|
||||
autoDetectKey,
|
||||
clearSavedKey,
|
||||
returnToLogin,
|
||||
copyDiagnostics,
|
||||
refreshEnvironment
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ export function DatabaseKeyPage({
|
||||
onSelfInfoChange,
|
||||
onContactsChange,
|
||||
onFilteredContactsChange,
|
||||
onReturnToLogin,
|
||||
onNotice
|
||||
}: {
|
||||
dbKey: string
|
||||
@@ -34,6 +35,7 @@ export function DatabaseKeyPage({
|
||||
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
|
||||
onContactsChange: (contacts: Contact[]) => void
|
||||
onFilteredContactsChange: (contacts: Contact[]) => void
|
||||
onReturnToLogin: () => void
|
||||
onNotice: (message: string) => void
|
||||
}): React.ReactElement {
|
||||
const controller = useDatabaseKeyController({
|
||||
@@ -45,6 +47,7 @@ export function DatabaseKeyPage({
|
||||
onSelfInfoChange,
|
||||
onContactsChange,
|
||||
onFilteredContactsChange,
|
||||
onReturnToLogin,
|
||||
onNotice
|
||||
})
|
||||
|
||||
@@ -132,6 +135,7 @@ export function DatabaseKeyPage({
|
||||
disabled={controller.isBusy || !controller.state.saved}
|
||||
onClear={() => void controller.clearSavedKey()}
|
||||
onReplace={scrollToEditor}
|
||||
onReturnToLogin={() => void controller.returnToLogin()}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user