mirror of https://github.com/kern/filepizza
Merge 241a3b5c8f into 3bd340d24b
commit
6f1b042c65
@ -0,0 +1,47 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import React, { useState, JSX, useEffect } from 'react'
|
||||||
|
import Downloader from './Downloader'
|
||||||
|
|
||||||
|
export default function MultiDownloader({
|
||||||
|
primaryUploaderID,
|
||||||
|
additionalUploaders,
|
||||||
|
}: {
|
||||||
|
primaryUploaderID: string
|
||||||
|
additionalUploaders: string[]
|
||||||
|
}): JSX.Element {
|
||||||
|
const [selectedUploader, setSelectedUploader] = useState<string>(primaryUploaderID)
|
||||||
|
const [key, setKey] = useState<number>(0)
|
||||||
|
const allUploaders = [primaryUploaderID, ...additionalUploaders]
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setKey(prevKey => prevKey + 1)
|
||||||
|
}, [selectedUploader])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full flex flex-col items-center">
|
||||||
|
<div className="w-full mb-4">
|
||||||
|
<h3 className="text-center mb-2 text-stone-700 dark:text-stone-300">
|
||||||
|
Multiple uploaders available for this shared link:
|
||||||
|
</h3>
|
||||||
|
<div className="flex flex-wrap justify-center gap-2 mb-4">
|
||||||
|
{allUploaders.map((uploader, i) => (
|
||||||
|
<button
|
||||||
|
key={uploader}
|
||||||
|
onClick={() => setSelectedUploader(uploader)}
|
||||||
|
className={`px-3 py-1 rounded transition-colors duration-200 ${
|
||||||
|
selectedUploader === uploader
|
||||||
|
? 'bg-green-500 text-white'
|
||||||
|
: 'bg-stone-200 dark:bg-stone-700 text-stone-800 dark:text-stone-200 hover:bg-stone-300 dark:hover:bg-stone-600'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
Uploader {i + 1}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Downloader key={key} uploaderPeerID={selectedUploader} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import React, { JSX, useCallback } from 'react'
|
||||||
|
import InputLabel from './InputLabel'
|
||||||
|
|
||||||
|
export default function SharedLinkField({
|
||||||
|
value,
|
||||||
|
onChange,
|
||||||
|
}: {
|
||||||
|
value: string
|
||||||
|
onChange: (v: string) => void
|
||||||
|
}): JSX.Element {
|
||||||
|
const handleChange = useCallback(
|
||||||
|
function (e: React.ChangeEvent<HTMLInputElement>): void {
|
||||||
|
onChange(e.target.value)
|
||||||
|
},
|
||||||
|
[onChange],
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col w-full">
|
||||||
|
<InputLabel
|
||||||
|
tooltip="Enter a shared link to collaborate with other uploaders. If this is filled, others with the same link will be able to provide the same files to downloaders. Leave empty to create a new upload."
|
||||||
|
>
|
||||||
|
Shared Link (optional)
|
||||||
|
</InputLabel>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
className="w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 border-stone-300 dark:border-stone-600 bg-white dark:bg-stone-800 text-stone-900 dark:text-stone-100"
|
||||||
|
placeholder="Paste a shared link to collaborate with others..."
|
||||||
|
value={value}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
<p className="mt-1 text-xs text-stone-500 dark:text-stone-400">
|
||||||
|
You can paste either a full URL or just the slug. When shared, multiple uploaders can provide the same files, making downloads more reliable.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue