diff --git a/src/app/settings/storage/page.tsx b/src/app/settings/storage/page.tsx index be98a01..d22d4f1 100644 --- a/src/app/settings/storage/page.tsx +++ b/src/app/settings/storage/page.tsx @@ -2,7 +2,8 @@ import { useCallback, useEffect, useState } from 'react'; import Link from 'next/link'; -import { ArrowLeft, Box, Cloud, HardDrive } from 'lucide-react'; +import { Box, Cloud, HardDrive } from 'lucide-react'; +import { ArrowLeftIcon } from '@/components/Icons'; import { StorageConfigurationPrompt } from '@/components/StorageConfigurationPrompt'; interface StorageStatus { @@ -15,7 +16,6 @@ interface StorageStatus { export default function StorageSettingsPage() { const [status, setStatus] = useState(null); const [error, setError] = useState(''); - const [showConnect, setShowConnect] = useState(false); const [isDisconnecting, setIsDisconnecting] = useState(false); const loadStatus = useCallback(async () => { @@ -48,19 +48,25 @@ export default function StorageSettingsPage() { } }; - return <> -
-
- -

Media Storage

-
-
-
+ return ( +
+
+ + + +
+

Media Storage

+

+ Manage where your account stores uploaded media +

+
+
+

Storage belongs to your account rather than this node. That keeps your media available if you move your account elsewhere.

-
+
{status?.provider === 'stuffbox' ? : status?.provider === 's3' ? : }
@@ -69,13 +75,23 @@ export default function StorageSettingsPage() { {status?.s3Provider && status.provider === 's3' &&
Provider: {status.s3Provider}
}
-
- - {status?.provider === 'stuffbox' && } -
+ {status?.provider === 'stuffbox' && ( + + )} +
+ +
+

+ {status?.provider ? 'Change storage' : 'Connect media storage'} +

+

+ Choose Stuffbox for the simplest setup, or connect an S3-compatible bucket you already own. +

+ {}} variant="inline" />
{error &&

{error}

} -
- { setShowConnect(false); await loadStatus(); }} onCancel={() => setShowConnect(false)} /> - ; + + ); } diff --git a/src/components/StorageConfigurationPrompt.tsx b/src/components/StorageConfigurationPrompt.tsx index c6f6f7c..07a1a81 100644 --- a/src/components/StorageConfigurationPrompt.tsx +++ b/src/components/StorageConfigurationPrompt.tsx @@ -7,9 +7,10 @@ interface StorageConfigurationPromptProps { open: boolean; onConfigured: () => void | Promise; onCancel: () => void; + variant?: 'modal' | 'inline'; } -export function StorageConfigurationPrompt({ open, onConfigured, onCancel }: StorageConfigurationPromptProps) { +export function StorageConfigurationPrompt({ open, onConfigured, onCancel, variant = 'modal' }: StorageConfigurationPromptProps) { const [provider, setProvider] = useState('r2'); const [endpoint, setEndpoint] = useState(''); const [publicBaseUrl, setPublicBaseUrl] = useState(''); @@ -103,35 +104,38 @@ export function StorageConfigurationPrompt({ open, onConfigured, onCancel }: Sto } }; - return ( -
-
event.stopPropagation()}> + const content = ( + <> + {variant === 'modal' && ( + <>

Connect media storage

Your media lives outside this Synapsis node, so your account stays portable.

+ + )} -
+
Stuffbox
- Connect once, then upload directly from your browser. Synapsis never sees your storage credentials. + Connect once, then uploads just work. You own your media and can take it anywhere.
-
+
- + - {showS3 && ( -
+ {showS3 && ( +

Advanced option. Credentials are encrypted locally; you may need to confirm your password again after the node restarts.

@@ -153,11 +157,22 @@ export function StorageConfigurationPrompt({ open, onConfigured, onCancel }: Sto - - )} + + )} - {error &&
{error}
} + {error &&
{error}
} + {variant === 'modal' && (
+ )} + + ); + + if (variant === 'inline') return content; + + return ( +
+
event.stopPropagation()}> + {content}
);