chore: format code and fix bundle identifier for v3.0.0 release

- Format all TypeScript/React code with Prettier
- Format all Rust code with cargo fmt
- Fix bundle identifier from .app to .desktop to avoid macOS conflicts
- Prepare codebase for v3.0.0 Tauri release
This commit is contained in:
Jason
2025-08-27 11:00:53 +08:00
parent 5e2e80b00d
commit 642e7a3817
23 changed files with 359 additions and 321 deletions

View File

@@ -22,7 +22,7 @@
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.2);
position: relative;
z-index: 1001;
display: flex; /* 纵向布局,便于底栏固定 */
display: flex; /* 纵向布局,便于底栏固定 */
flex-direction: column;
}
@@ -40,7 +40,10 @@
}
/* 左侧占位以保证标题居中(与右侧关闭按钮宽度相当) */
.modal-spacer { width: 32px; flex: 0 0 32px; }
.modal-spacer {
width: 32px;
flex: 0 0 32px;
}
.modal-title {
flex: 1;
@@ -69,16 +72,17 @@
color: #fff;
}
.modal-form { /* 表单外层包裹 body + footer */
.modal-form {
/* 表单外层包裹 body + footer */
display: flex;
flex-direction: column;
flex: 1 1 auto;
min-height: 0; /* 允许子元素正确计算高度 */
min-height: 0; /* 允许子元素正确计算高度 */
}
.modal-body {
padding: 1.25rem 1.5rem 1.5rem;
overflow: auto; /* 仅内容区滚动 */
overflow: auto; /* 仅内容区滚动 */
flex: 1 1 auto;
min-height: 0;
}
@@ -175,7 +179,8 @@
border-color: #3498db;
}
.modal-footer { /* 固定在弹窗底部(非滚动区) */
.modal-footer {
/* 固定在弹窗底部(非滚动区) */
display: flex;
gap: 1rem;
justify-content: flex-end;

View File

@@ -68,7 +68,9 @@
cursor: pointer;
font-size: 0.9rem;
font-weight: 500;
transition: background-color 0.2s, transform 0.1s;
transition:
background-color 0.2s,
transform 0.1s;
min-width: 70px;
}
@@ -102,4 +104,4 @@
.confirm-btn:focus {
outline: 2px solid #007bff;
outline-offset: 2px;
}
}

View File

@@ -1,5 +1,5 @@
import React from 'react';
import './ConfirmDialog.css';
import React from "react";
import "./ConfirmDialog.css";
interface ConfirmDialogProps {
isOpen: boolean;
@@ -15,10 +15,10 @@ export const ConfirmDialog: React.FC<ConfirmDialogProps> = ({
isOpen,
title,
message,
confirmText = '确定',
cancelText = '取消',
confirmText = "确定",
cancelText = "取消",
onConfirm,
onCancel
onCancel,
}) => {
if (!isOpen) return null;
@@ -32,15 +32,15 @@ export const ConfirmDialog: React.FC<ConfirmDialogProps> = ({
<p>{message}</p>
</div>
<div className="confirm-actions">
<button
className="confirm-btn cancel-btn"
<button
className="confirm-btn cancel-btn"
onClick={onCancel}
autoFocus
>
{cancelText}
</button>
<button
className="confirm-btn confirm-btn-primary"
<button
className="confirm-btn confirm-btn-primary"
onClick={onConfirm}
>
{confirmText}
@@ -49,4 +49,4 @@ export const ConfirmDialog: React.FC<ConfirmDialogProps> = ({
</div>
</div>
);
};
};

View File

@@ -1,20 +1,24 @@
import React from 'react'
import { Provider } from '../types'
import ProviderForm from './ProviderForm'
import React from "react";
import { Provider } from "../types";
import ProviderForm from "./ProviderForm";
interface EditProviderModalProps {
provider: Provider
onSave: (provider: Provider) => void
onClose: () => void
provider: Provider;
onSave: (provider: Provider) => void;
onClose: () => void;
}
const EditProviderModal: React.FC<EditProviderModalProps> = ({ provider, onSave, onClose }) => {
const handleSubmit = (data: Omit<Provider, 'id'>) => {
const EditProviderModal: React.FC<EditProviderModalProps> = ({
provider,
onSave,
onClose,
}) => {
const handleSubmit = (data: Omit<Provider, "id">) => {
onSave({
...provider,
...data
})
}
...data,
});
};
return (
<ProviderForm
@@ -25,7 +29,7 @@ const EditProviderModal: React.FC<EditProviderModalProps> = ({ provider, onSave,
onSubmit={handleSubmit}
onClose={onClose}
/>
)
}
);
};
export default EditProviderModal
export default EditProviderModal;

View File

@@ -80,7 +80,7 @@ const ProviderForm: React.FC<ProviderFormProps> = ({
};
const handleChange = (
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
) => {
const { name, value } = e.target;
@@ -117,7 +117,7 @@ const ProviderForm: React.FC<ProviderFormProps> = ({
// 更新JSON配置
const updatedConfig = updateCoAuthoredSetting(
formData.settingsConfig,
checked
checked,
);
setFormData({
...formData,
@@ -152,7 +152,7 @@ const ProviderForm: React.FC<ProviderFormProps> = ({
const configString = setApiKeyInConfig(
formData.settingsConfig,
key.trim(),
{ createIfMissing: selectedPreset !== null }
{ createIfMissing: selectedPreset !== null },
);
// 更新表单配置
@@ -174,7 +174,7 @@ const ProviderForm: React.FC<ProviderFormProps> = ({
useEffect(() => {
if (initialData) {
const parsedKey = getApiKeyFromConfig(
JSON.stringify(initialData.settingsConfig)
JSON.stringify(initialData.settingsConfig),
);
if (parsedKey) setApiKey(parsedKey);
}
@@ -255,7 +255,9 @@ const ProviderForm: React.FC<ProviderFormProps> = ({
/>
</div>
<div className={`form-group api-key-group ${!showApiKey ? 'hidden' : ''}`}>
<div
className={`form-group api-key-group ${!showApiKey ? "hidden" : ""}`}
>
<label htmlFor="apiKey">API Key *</label>
<input
type="text"

View File

@@ -203,4 +203,4 @@
.delete-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}

View File

@@ -1,13 +1,13 @@
import React from 'react'
import { Provider } from '../types'
import './ProviderList.css'
import React from "react";
import { Provider } from "../types";
import "./ProviderList.css";
interface ProviderListProps {
providers: Record<string, Provider>
currentProviderId: string
onSwitch: (id: string) => void
onDelete: (id: string) => void
onEdit: (id: string) => void
providers: Record<string, Provider>;
currentProviderId: string;
onSwitch: (id: string) => void;
onDelete: (id: string) => void;
onEdit: (id: string) => void;
}
const ProviderList: React.FC<ProviderListProps> = ({
@@ -15,28 +15,28 @@ const ProviderList: React.FC<ProviderListProps> = ({
currentProviderId,
onSwitch,
onDelete,
onEdit
onEdit,
}) => {
// 提取API地址
const getApiUrl = (provider: Provider): string => {
try {
const config = provider.settingsConfig
const config = provider.settingsConfig;
if (config?.env?.ANTHROPIC_BASE_URL) {
return config.env.ANTHROPIC_BASE_URL
return config.env.ANTHROPIC_BASE_URL;
}
return '未设置'
return "未设置";
} catch {
return '配置错误'
return "配置错误";
}
}
};
const handleUrlClick = async (url: string) => {
try {
await window.api.openExternal(url)
await window.api.openExternal(url);
} catch (error) {
console.error('打开链接失败:', error)
console.error("打开链接失败:", error);
}
}
};
return (
<div className="provider-list">
@@ -48,25 +48,27 @@ const ProviderList: React.FC<ProviderListProps> = ({
) : (
<div className="provider-items">
{Object.values(providers).map((provider) => {
const isCurrent = provider.id === currentProviderId
const isCurrent = provider.id === currentProviderId;
return (
<div
key={provider.id}
className={`provider-item ${isCurrent ? 'current' : ''}`}
<div
key={provider.id}
className={`provider-item ${isCurrent ? "current" : ""}`}
>
<div className="provider-info">
<div className="provider-name">
<span>{provider.name}</span>
{isCurrent && <span className="current-badge">使</span>}
{isCurrent && (
<span className="current-badge">使</span>
)}
</div>
<div className="provider-url">
{provider.websiteUrl ? (
<a
href="#"
<a
href="#"
onClick={(e) => {
e.preventDefault()
handleUrlClick(provider.websiteUrl!)
e.preventDefault();
handleUrlClick(provider.websiteUrl!);
}}
className="url-link"
title={`访问 ${provider.websiteUrl}`}
@@ -80,23 +82,23 @@ const ProviderList: React.FC<ProviderListProps> = ({
)}
</div>
</div>
<div className="provider-actions">
<button
<button
className="enable-btn"
onClick={() => onSwitch(provider.id)}
disabled={isCurrent}
>
</button>
<button
<button
className="edit-btn"
onClick={() => onEdit(provider.id)}
disabled={isCurrent}
>
</button>
<button
<button
className="delete-btn"
onClick={() => onDelete(provider.id)}
disabled={isCurrent}
@@ -105,12 +107,12 @@ const ProviderList: React.FC<ProviderListProps> = ({
</button>
</div>
</div>
)
);
})}
</div>
)}
</div>
)
}
);
};
export default ProviderList
export default ProviderList;