mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: harden Docker image and async job responses
Harden Docker runtime packaging, preserve async job response semantics, fix Redis subscriber startup connections, clear lint warnings, and harden enterprise S3 object body handling.
This commit is contained in:
@@ -363,7 +363,14 @@ export function AutomatePage() {
|
||||
}
|
||||
};
|
||||
input.click();
|
||||
}, [setSavedPipelines]);
|
||||
}, [
|
||||
setSavedPipelines,
|
||||
t.automate.invalidPipelineFile,
|
||||
t.automate.noSteps,
|
||||
t.automate.newerVersion,
|
||||
t.automate.missingName,
|
||||
t.automate.couldNotRead,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!importError) return;
|
||||
@@ -418,13 +425,16 @@ export function AutomatePage() {
|
||||
*/
|
||||
function renderPipelinePreview(mode: "result" | "original") {
|
||||
const kind = currentEntry?.previewKind ?? "image";
|
||||
const sourceUrl = originalBlobUrl;
|
||||
if (!sourceUrl) return null;
|
||||
|
||||
if (mode === "result") {
|
||||
if (!processedUrl) return null;
|
||||
if (kind === "image") {
|
||||
return (
|
||||
<BeforeAfterSlider
|
||||
beforeSrc={originalBlobUrl!}
|
||||
afterSrc={processedUrl as string}
|
||||
beforeSrc={sourceUrl}
|
||||
afterSrc={processedUrl}
|
||||
beforeSize={originalSize ?? undefined}
|
||||
afterSize={processedSize ?? undefined}
|
||||
/>
|
||||
@@ -440,7 +450,7 @@ export function AutomatePage() {
|
||||
if (kind === "audio") {
|
||||
return (
|
||||
<Suspense fallback={<div className="text-sm text-muted-foreground">Loading...</div>}>
|
||||
<WaveformPlayer src={processedUrl as string} />
|
||||
<WaveformPlayer src={processedUrl} />
|
||||
</Suspense>
|
||||
);
|
||||
}
|
||||
@@ -467,7 +477,7 @@ export function AutomatePage() {
|
||||
if (kind === "image") {
|
||||
return (
|
||||
<ImageViewer
|
||||
src={originalBlobUrl!}
|
||||
src={sourceUrl}
|
||||
filename={selectedFileName ?? files[0].name}
|
||||
fileSize={selectedFileSize ?? files[0].size}
|
||||
/>
|
||||
@@ -483,7 +493,7 @@ export function AutomatePage() {
|
||||
if (kind === "audio") {
|
||||
return (
|
||||
<Suspense fallback={<div className="text-sm text-muted-foreground">Loading...</div>}>
|
||||
<WaveformPlayer src={originalBlobUrl!} />
|
||||
<WaveformPlayer src={sourceUrl} />
|
||||
</Suspense>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ export function LoginPage() {
|
||||
body: JSON.stringify({ username, password }),
|
||||
});
|
||||
if (!res.ok) {
|
||||
const data = await res.json().catch(() => ({}));
|
||||
const _data = await res.json().catch(() => ({}));
|
||||
setError(t.auth.invalidCredentials);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ function FileSelectionInfo({
|
||||
const entry = fileEntries[i];
|
||||
return (
|
||||
<button
|
||||
key={`${file.name}-${i}`}
|
||||
key={entry?.blobUrl ?? `${file.name}-${file.size}-${file.lastModified}`}
|
||||
type="button"
|
||||
onClick={() => onSelect(i)}
|
||||
className={`w-full flex items-center gap-1.5 text-xs rounded px-2 py-1.5 text-start transition-colors ${isSelected ? "bg-primary/10 text-foreground" : "text-muted-foreground hover:bg-muted"}`}
|
||||
|
||||
Reference in New Issue
Block a user