75 lines
1.7 KiB
TypeScript
75 lines
1.7 KiB
TypeScript
import { DropzoneOptions } from 'react-dropzone'
|
|
import { NostrCheckServer } from './nostrcheck-server'
|
|
import { BaseError } from 'types'
|
|
|
|
export interface MediaOperations {
|
|
post: (file: File) => Promise<string>
|
|
}
|
|
export type MediaStrategy = Omit<MediaOperations, 'auth'>
|
|
|
|
export interface MediaOption {
|
|
name: string
|
|
host: string
|
|
type: 'nostrcheck-server' | 'route96'
|
|
}
|
|
|
|
// nostr.build based dropzone options
|
|
export const MEDIA_DROPZONE_OPTIONS: DropzoneOptions = {
|
|
maxSize: 7000000,
|
|
accept: {
|
|
'image/*': ['.jpeg', '.png', '.jpg', '.gif', '.webp']
|
|
}
|
|
}
|
|
|
|
export const MEDIA_OPTIONS: MediaOption[] = [
|
|
// {
|
|
// name: 'nostr.build',
|
|
// host: 'https://nostr.build/',
|
|
// type: 'nostrcheck-server'
|
|
// },
|
|
{
|
|
name: 'nostrcheck.me',
|
|
host: 'https://nostrcheck.me/',
|
|
type: 'nostrcheck-server'
|
|
},
|
|
{
|
|
name: 'nostpic.com',
|
|
host: 'https://nostpic.com/',
|
|
type: 'nostrcheck-server'
|
|
},
|
|
{
|
|
name: 'files.sovbit.host',
|
|
host: 'https://files.sovbit.host/',
|
|
type: 'nostrcheck-server'
|
|
}
|
|
// {
|
|
// name: 'void.cat',
|
|
// host: 'https://void.cat/',
|
|
// type: 'route96'
|
|
// }
|
|
]
|
|
|
|
enum ImageErrorType {
|
|
'TYPE_MISSING' = 'Media Option must include a type.'
|
|
}
|
|
|
|
export class ImageController implements MediaStrategy {
|
|
post: (file: File) => Promise<string>
|
|
|
|
constructor(mediaOption: MediaOption) {
|
|
let strategy: MediaStrategy
|
|
switch (mediaOption.type) {
|
|
case 'nostrcheck-server':
|
|
strategy = new NostrCheckServer(mediaOption.host)
|
|
this.post = strategy.post
|
|
break
|
|
|
|
case 'route96':
|
|
throw new Error('Not implemented.')
|
|
|
|
default:
|
|
throw new BaseError(ImageErrorType.TYPE_MISSING)
|
|
}
|
|
}
|
|
}
|