generated from nhcarrigan/template
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
10e013a983
|
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nhcarrigan/eslint-config": "5.2.0",
|
"@nhcarrigan/eslint-config": "5.2.0",
|
||||||
"@nhcarrigan/typescript-config": "4.0.0",
|
"@nhcarrigan/typescript-config": "4.0.0",
|
||||||
"@tauri-apps/cli": "2.10.1",
|
"@tauri-apps/cli": "2.5.0",
|
||||||
"@types/react": "19.1.2",
|
"@types/react": "19.1.2",
|
||||||
"@types/react-dom": "19.1.2",
|
"@types/react-dom": "19.1.2",
|
||||||
"autoprefixer": "10.4.21",
|
"autoprefixer": "10.4.21",
|
||||||
|
|||||||
Generated
+49
-49
@@ -31,8 +31,8 @@ importers:
|
|||||||
specifier: 4.0.0
|
specifier: 4.0.0
|
||||||
version: 4.0.0(typescript@5.8.3)
|
version: 4.0.0(typescript@5.8.3)
|
||||||
'@tauri-apps/cli':
|
'@tauri-apps/cli':
|
||||||
specifier: 2.10.1
|
specifier: 2.5.0
|
||||||
version: 2.10.1
|
version: 2.5.0
|
||||||
'@types/react':
|
'@types/react':
|
||||||
specifier: 19.1.2
|
specifier: 19.1.2
|
||||||
version: 19.1.2
|
version: 19.1.2
|
||||||
@@ -578,74 +578,74 @@ packages:
|
|||||||
'@tauri-apps/api@2.5.0':
|
'@tauri-apps/api@2.5.0':
|
||||||
resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==}
|
resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==}
|
||||||
|
|
||||||
'@tauri-apps/cli-darwin-arm64@2.10.1':
|
'@tauri-apps/cli-darwin-arm64@2.5.0':
|
||||||
resolution: {integrity: sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==}
|
resolution: {integrity: sha512-VuVAeTFq86dfpoBDNYAdtQVLbP0+2EKCHIIhkaxjeoPARR0sLpFHz2zs0PcFU76e+KAaxtEtAJAXGNUc8E1PzQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@tauri-apps/cli-darwin-x64@2.10.1':
|
'@tauri-apps/cli-darwin-x64@2.5.0':
|
||||||
resolution: {integrity: sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==}
|
resolution: {integrity: sha512-hUF01sC06cZVa8+I0/VtsHOk9BbO75rd+YdtHJ48xTdcYaQ5QIwL4yZz9OR1AKBTaUYhBam8UX9Pvd5V2/4Dpw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.10.1':
|
'@tauri-apps/cli-linux-arm-gnueabihf@2.5.0':
|
||||||
resolution: {integrity: sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==}
|
resolution: {integrity: sha512-LQKqttsK252LlqYyX8R02MinUsfFcy3+NZiJwHFgi5Y3+ZUIAED9cSxJkyNtuY5KMnR4RlpgWyLv4P6akN1xhg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-arm64-gnu@2.5.0':
|
||||||
resolution: {integrity: sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==}
|
resolution: {integrity: sha512-mTQufsPcpdHg5RW0zypazMo4L55EfeE5snTzrPqbLX4yCK2qalN7+rnP8O8GT06xhp6ElSP/Ku1M2MR297SByQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm64-musl@2.10.1':
|
'@tauri-apps/cli-linux-arm64-musl@2.5.0':
|
||||||
resolution: {integrity: sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==}
|
resolution: {integrity: sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-riscv64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-riscv64-gnu@2.5.0':
|
||||||
resolution: {integrity: sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==}
|
resolution: {integrity: sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-x64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-x64-gnu@2.5.0':
|
||||||
resolution: {integrity: sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==}
|
resolution: {integrity: sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-x64-musl@2.10.1':
|
'@tauri-apps/cli-linux-x64-musl@2.5.0':
|
||||||
resolution: {integrity: sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==}
|
resolution: {integrity: sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-arm64-msvc@2.10.1':
|
'@tauri-apps/cli-win32-arm64-msvc@2.5.0':
|
||||||
resolution: {integrity: sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==}
|
resolution: {integrity: sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-ia32-msvc@2.10.1':
|
'@tauri-apps/cli-win32-ia32-msvc@2.5.0':
|
||||||
resolution: {integrity: sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==}
|
resolution: {integrity: sha512-EArv1IaRlogdLAQyGlKmEqZqm5RfHCUMhJoedWu7GtdbOMUfSAz6FMX2boE1PtEmNO4An+g188flLeVErrxEKg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-x64-msvc@2.10.1':
|
'@tauri-apps/cli-win32-x64-msvc@2.5.0':
|
||||||
resolution: {integrity: sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==}
|
resolution: {integrity: sha512-lj43EFYbnAta8pd9JnUq87o+xRUR0odz+4rixBtTUwUgdRdwQ2V9CzFtsMu6FQKpFQ6mujRK6P1IEwhL6ADRsQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@tauri-apps/cli@2.10.1':
|
'@tauri-apps/cli@2.5.0':
|
||||||
resolution: {integrity: sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==}
|
resolution: {integrity: sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2849,52 +2849,52 @@ snapshots:
|
|||||||
|
|
||||||
'@tauri-apps/api@2.5.0': {}
|
'@tauri-apps/api@2.5.0': {}
|
||||||
|
|
||||||
'@tauri-apps/cli-darwin-arm64@2.10.1':
|
'@tauri-apps/cli-darwin-arm64@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-darwin-x64@2.10.1':
|
'@tauri-apps/cli-darwin-x64@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm-gnueabihf@2.10.1':
|
'@tauri-apps/cli-linux-arm-gnueabihf@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-arm64-gnu@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-arm64-musl@2.10.1':
|
'@tauri-apps/cli-linux-arm64-musl@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-riscv64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-riscv64-gnu@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-x64-gnu@2.10.1':
|
'@tauri-apps/cli-linux-x64-gnu@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-linux-x64-musl@2.10.1':
|
'@tauri-apps/cli-linux-x64-musl@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-arm64-msvc@2.10.1':
|
'@tauri-apps/cli-win32-arm64-msvc@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-ia32-msvc@2.10.1':
|
'@tauri-apps/cli-win32-ia32-msvc@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli-win32-x64-msvc@2.10.1':
|
'@tauri-apps/cli-win32-x64-msvc@2.5.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@tauri-apps/cli@2.10.1':
|
'@tauri-apps/cli@2.5.0':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@tauri-apps/cli-darwin-arm64': 2.10.1
|
'@tauri-apps/cli-darwin-arm64': 2.5.0
|
||||||
'@tauri-apps/cli-darwin-x64': 2.10.1
|
'@tauri-apps/cli-darwin-x64': 2.5.0
|
||||||
'@tauri-apps/cli-linux-arm-gnueabihf': 2.10.1
|
'@tauri-apps/cli-linux-arm-gnueabihf': 2.5.0
|
||||||
'@tauri-apps/cli-linux-arm64-gnu': 2.10.1
|
'@tauri-apps/cli-linux-arm64-gnu': 2.5.0
|
||||||
'@tauri-apps/cli-linux-arm64-musl': 2.10.1
|
'@tauri-apps/cli-linux-arm64-musl': 2.5.0
|
||||||
'@tauri-apps/cli-linux-riscv64-gnu': 2.10.1
|
'@tauri-apps/cli-linux-riscv64-gnu': 2.5.0
|
||||||
'@tauri-apps/cli-linux-x64-gnu': 2.10.1
|
'@tauri-apps/cli-linux-x64-gnu': 2.5.0
|
||||||
'@tauri-apps/cli-linux-x64-musl': 2.10.1
|
'@tauri-apps/cli-linux-x64-musl': 2.5.0
|
||||||
'@tauri-apps/cli-win32-arm64-msvc': 2.10.1
|
'@tauri-apps/cli-win32-arm64-msvc': 2.5.0
|
||||||
'@tauri-apps/cli-win32-ia32-msvc': 2.10.1
|
'@tauri-apps/cli-win32-ia32-msvc': 2.5.0
|
||||||
'@tauri-apps/cli-win32-x64-msvc': 2.10.1
|
'@tauri-apps/cli-win32-x64-msvc': 2.5.0
|
||||||
|
|
||||||
'@tauri-apps/plugin-dialog@2.3.0':
|
'@tauri-apps/plugin-dialog@2.3.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
+14
-10
@@ -83,22 +83,26 @@ fn build_user_gemini_parts(
|
|||||||
user_image_base64: &Option<String>,
|
user_image_base64: &Option<String>,
|
||||||
user_image_mime: &Option<String>,
|
user_image_mime: &Option<String>,
|
||||||
) -> Vec<Value> {
|
) -> Vec<Value> {
|
||||||
if mode == "replace" && user_image_base64.is_some() {
|
if let Some(image_data) = user_image_base64.as_deref() {
|
||||||
let mime = user_image_mime.as_deref().unwrap_or("image/png");
|
let mime = user_image_mime.as_deref().unwrap_or("image/png");
|
||||||
let data = user_image_base64.as_deref().unwrap_or("");
|
|
||||||
let base_text = user_text.as_deref().unwrap_or("");
|
let base_text = user_text.as_deref().unwrap_or("");
|
||||||
let final_text = if base_text.is_empty() {
|
let final_text = if mode == "replace" {
|
||||||
REPLACE_MODE_APPEND.to_string()
|
if base_text.is_empty() {
|
||||||
|
REPLACE_MODE_APPEND.to_string()
|
||||||
|
} else {
|
||||||
|
format!("{}\n{}", base_text, REPLACE_MODE_APPEND)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
format!("{}\n{}", base_text, REPLACE_MODE_APPEND)
|
base_text.to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
vec![
|
let mut parts = vec![json!({"inlineData": {"mimeType": mime, "data": image_data}})];
|
||||||
json!({"inlineData": {"mimeType": mime, "data": data}}),
|
if !final_text.is_empty() {
|
||||||
json!({"text": final_text}),
|
parts.push(json!({"text": final_text}));
|
||||||
]
|
}
|
||||||
|
parts
|
||||||
} else {
|
} else {
|
||||||
// Art/avatar mode, or replace mode follow-up correction (text only)
|
// No image: text-only message
|
||||||
let text = user_text.as_deref().unwrap_or("");
|
let text = user_text.as_deref().unwrap_or("");
|
||||||
vec![json!({"text": text})]
|
vec![json!({"text": text})]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,7 +256,8 @@ const inputArea = ({
|
|||||||
if (isInitialReplace && imageBase64 === undefined) {
|
if (isInitialReplace && imageBase64 === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!isInitialReplace && text.trim().length === 0) {
|
const hasContent = text.trim().length > 0 || imageBase64 !== undefined;
|
||||||
|
if (!isInitialReplace && !hasContent) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,6 +333,9 @@ const inputArea = ({
|
|||||||
: dropZoneInactiveClass,
|
: dropZoneInactiveClass,
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
|
||||||
|
const hasNoContent = text.trim().length === 0 && imageBase64 === undefined;
|
||||||
|
const isSendDisabled = isLoading || hasNoContent;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="border-t border-purple-900/30 p-4 bg-[#0f0a1a]">
|
<div className="border-t border-purple-900/30 p-4 bg-[#0f0a1a]">
|
||||||
<div className="flex items-center gap-2 mb-2">
|
<div className="flex items-center gap-2 mb-2">
|
||||||
@@ -397,6 +401,15 @@ const inputArea = ({
|
|||||||
type="file"
|
type="file"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<textarea
|
||||||
|
className={textareaClass}
|
||||||
|
disabled={isLoading}
|
||||||
|
onChange={handleTextChange}
|
||||||
|
placeholder="Add notes to include with the image (optional)..."
|
||||||
|
rows={2}
|
||||||
|
value={text}
|
||||||
|
/>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className={replaceButtonClass}
|
className={replaceButtonClass}
|
||||||
disabled={isLoading || imageBase64 === undefined}
|
disabled={isLoading || imageBase64 === undefined}
|
||||||
@@ -414,41 +427,40 @@ const inputArea = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
: <div className="flex flex-col gap-3">
|
: <div className="flex flex-col gap-3">
|
||||||
{mode === "replace"
|
<div className="flex flex-col gap-2">
|
||||||
? <div className="flex flex-col gap-2">
|
{imagePreview === undefined
|
||||||
{imagePreview === undefined
|
? <button
|
||||||
? <button
|
className={pasteButtonClass}
|
||||||
className={pasteButtonClass}
|
onClick={handlePasteButtonClick}
|
||||||
onClick={handlePasteButtonClick}
|
type="button"
|
||||||
|
>
|
||||||
|
{mode === "replace"
|
||||||
|
? "📋 Paste replacement image (optional)"
|
||||||
|
: "📋 Paste image (optional)"}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
: <div className="relative inline-block">
|
||||||
|
<img
|
||||||
|
alt="Upload preview"
|
||||||
|
className="max-h-32 rounded-lg border border-purple-700/40"
|
||||||
|
src={imagePreview}
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
className={clearButtonClass}
|
||||||
|
onClick={clearImage}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
{"📋 Paste replacement image (optional)"}
|
{"×"}
|
||||||
</button>
|
</button>
|
||||||
|
</div>}
|
||||||
: <div className="relative inline-block">
|
<input
|
||||||
<img
|
accept="image/*"
|
||||||
alt="Upload preview"
|
className="hidden"
|
||||||
className="max-h-32 rounded-lg border border-purple-700/40"
|
onChange={handleFileChange}
|
||||||
src={imagePreview}
|
ref={fileInputReference}
|
||||||
/>
|
type="file"
|
||||||
<button
|
/>
|
||||||
className={clearButtonClass}
|
</div>
|
||||||
onClick={clearImage}
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
{"×"}
|
|
||||||
</button>
|
|
||||||
</div>}
|
|
||||||
<input
|
|
||||||
accept="image/*"
|
|
||||||
className="hidden"
|
|
||||||
onChange={handleFileChange}
|
|
||||||
ref={fileInputReference}
|
|
||||||
type="file"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
: null}
|
|
||||||
|
|
||||||
<div className="flex gap-3 items-end">
|
<div className="flex gap-3 items-end">
|
||||||
<textarea
|
<textarea
|
||||||
@@ -464,7 +476,7 @@ const inputArea = ({
|
|||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
className={sendButtonClass}
|
className={sendButtonClass}
|
||||||
disabled={isLoading || text.trim().length === 0}
|
disabled={isSendDisabled}
|
||||||
onClick={handleSend}
|
onClick={handleSend}
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user