122 lines
4.4 KiB
TypeScript
122 lines
4.4 KiB
TypeScript
import type { Nip95Config } from '@/lib/configStorageTypes'
|
|
import { Nip95ConfigView } from './view'
|
|
import { addApi, onDragOver, onDragStart, onDrop, removeApi, toggleEnabled, updateUrl } from './controller'
|
|
|
|
type ViewProps = Parameters<typeof Nip95ConfigView>[0]
|
|
|
|
export function createNip95ConfigViewProps(params: {
|
|
apis: Nip95Config[]
|
|
loading: boolean
|
|
error: string | null
|
|
editingId: string | null
|
|
newUrl: string
|
|
showAddForm: boolean
|
|
draggedId: string | null
|
|
dragOverId: string | null
|
|
setApis: (value: Nip95Config[]) => void
|
|
setError: (value: string | null) => void
|
|
setEditingId: (value: string | null) => void
|
|
setNewUrl: (value: string) => void
|
|
setShowAddForm: (value: boolean | ((prev: boolean) => boolean)) => void
|
|
setDraggedId: (value: string | null) => void
|
|
setDragOverId: (value: string | null) => void
|
|
onConfigChange: (() => void) | undefined
|
|
}): ViewProps {
|
|
return { ...baseStateProps(params), ...formHandlers(params), ...apiHandlers(params), ...dragHandlers(params) }
|
|
}
|
|
|
|
function baseStateProps(params: {
|
|
apis: Nip95Config[]
|
|
loading: boolean
|
|
error: string | null
|
|
editingId: string | null
|
|
newUrl: string
|
|
showAddForm: boolean
|
|
draggedId: string | null
|
|
dragOverId: string | null
|
|
}): Pick<ViewProps, 'apis' | 'loading' | 'error' | 'editingId' | 'newUrl' | 'showAddForm' | 'draggedId' | 'dragOverId'> {
|
|
return {
|
|
apis: params.apis,
|
|
loading: params.loading,
|
|
error: params.error,
|
|
editingId: params.editingId,
|
|
newUrl: params.newUrl,
|
|
showAddForm: params.showAddForm,
|
|
draggedId: params.draggedId,
|
|
dragOverId: params.dragOverId,
|
|
}
|
|
}
|
|
|
|
function formHandlers(params: {
|
|
newUrl: string
|
|
setApis: (value: Nip95Config[]) => void
|
|
setError: (value: string | null) => void
|
|
setNewUrl: (value: string) => void
|
|
setShowAddForm: (value: boolean | ((prev: boolean) => boolean)) => void
|
|
onConfigChange: (() => void) | undefined
|
|
}): Pick<ViewProps, 'onClearError' | 'onToggleAddForm' | 'onNewUrlChange' | 'onCancelAdd' | 'onAddApi'> {
|
|
return {
|
|
onClearError: () => params.setError(null),
|
|
onToggleAddForm: () => params.setShowAddForm((prev) => !prev),
|
|
onNewUrlChange: (value) => params.setNewUrl(value),
|
|
onCancelAdd: () => {
|
|
params.setShowAddForm(false)
|
|
params.setNewUrl('')
|
|
params.setError(null)
|
|
},
|
|
onAddApi: () =>
|
|
void addApi({
|
|
newUrl: params.newUrl,
|
|
setError: params.setError,
|
|
setNewUrl: params.setNewUrl,
|
|
setShowAddForm: params.setShowAddForm,
|
|
setApis: params.setApis,
|
|
onConfigChange: params.onConfigChange,
|
|
}),
|
|
}
|
|
}
|
|
|
|
function apiHandlers(params: {
|
|
setApis: (value: Nip95Config[]) => void
|
|
setError: (value: string | null) => void
|
|
setEditingId: (value: string | null) => void
|
|
onConfigChange: (() => void) | undefined
|
|
}): Pick<ViewProps, 'onStartEditing' | 'onStopEditing' | 'onUpdateUrl' | 'onToggleEnabled' | 'onRemoveApi'> {
|
|
return {
|
|
onStartEditing: (id) => params.setEditingId(id),
|
|
onStopEditing: () => params.setEditingId(null),
|
|
onUpdateUrl: (id, url) =>
|
|
void updateUrl({ id, url, setError: params.setError, setEditingId: params.setEditingId, setApis: params.setApis, onConfigChange: params.onConfigChange }),
|
|
onToggleEnabled: (id, enabled) => void toggleEnabled({ id, enabled, setError: params.setError, setApis: params.setApis, onConfigChange: params.onConfigChange }),
|
|
onRemoveApi: (id) => void removeApi({ id, setError: params.setError, setApis: params.setApis, onConfigChange: params.onConfigChange }),
|
|
}
|
|
}
|
|
|
|
function dragHandlers(params: {
|
|
apis: Nip95Config[]
|
|
draggedId: string | null
|
|
setApis: (value: Nip95Config[]) => void
|
|
setDraggedId: (value: string | null) => void
|
|
setDragOverId: (value: string | null) => void
|
|
setError: (value: string | null) => void
|
|
onConfigChange: (() => void) | undefined
|
|
}): Pick<ViewProps, 'onDragStart' | 'onDragOver' | 'onDragLeave' | 'onDrop'> {
|
|
return {
|
|
onDragStart: (e, id) => onDragStart({ e, id, setDraggedId: params.setDraggedId }),
|
|
onDragOver: (e, id) => onDragOver({ e, id, setDragOverId: params.setDragOverId }),
|
|
onDragLeave: () => params.setDragOverId(null),
|
|
onDrop: (e, targetId) =>
|
|
void onDrop({
|
|
e,
|
|
targetId,
|
|
apis: params.apis,
|
|
draggedId: params.draggedId,
|
|
setApis: params.setApis,
|
|
setDraggedId: params.setDraggedId,
|
|
setDragOverId: params.setDragOverId,
|
|
setError: params.setError,
|
|
onConfigChange: params.onConfigChange,
|
|
}),
|
|
}
|
|
}
|