2026-01-13 14:49:19 +01:00

131 lines
4.7 KiB
TypeScript

import type { RelayConfig } from '@/lib/configStorageTypes'
import type { RelayManagerProps } from './RelayManager'
import { addRelay, onDragOver, onDragStart, onDrop, removeRelay, toggleEnabled, updateUrl } from './controller'
import type { RelayManagerViewProps } from './types'
export function buildRelayManagerViewProps(params: {
relays: RelayConfig[]
loading: boolean
error: string | null
editingId: string | null
newUrl: string
showAddForm: boolean
draggedId: string | null
dragOverId: string | null
setRelays: (value: RelayConfig[]) => void
setLoading: (value: boolean) => 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: RelayManagerProps['onConfigChange']
}): RelayManagerViewProps {
return { ...stateProps(params), ...formProps(params), ...relayActionProps(params), ...dragProps(params) }
}
function stateProps(params: {
relays: RelayConfig[]
loading: boolean
error: string | null
editingId: string | null
newUrl: string
showAddForm: boolean
draggedId: string | null
dragOverId: string | null
}): Pick<RelayManagerViewProps, 'relays' | 'loading' | 'error' | 'editingId' | 'newUrl' | 'showAddForm' | 'draggedId' | 'dragOverId'> {
return {
relays: params.relays,
loading: params.loading,
error: params.error,
editingId: params.editingId,
newUrl: params.newUrl,
showAddForm: params.showAddForm,
draggedId: params.draggedId,
dragOverId: params.dragOverId,
}
}
function formProps(params: {
newUrl: string
setError: (value: string | null) => void
setNewUrl: (value: string) => void
setShowAddForm: (value: boolean | ((prev: boolean) => boolean)) => void
setRelays: (value: RelayConfig[]) => void
onConfigChange: RelayManagerProps['onConfigChange']
}): Pick<RelayManagerViewProps, 'onClearError' | 'onToggleAddForm' | 'onNewUrlChange' | 'onCancelAdd' | 'onAddRelay'> {
return {
onClearError: () => params.setError(null),
onToggleAddForm: () => params.setShowAddForm((prev) => !prev),
onNewUrlChange: (value) => params.setNewUrl(value),
onCancelAdd: () => {
params.setShowAddForm(false)
params.setNewUrl('')
params.setError(null)
},
onAddRelay: () =>
void addRelay({
newUrl: params.newUrl,
setError: params.setError,
setNewUrl: params.setNewUrl,
setShowAddForm: params.setShowAddForm,
setRelays: params.setRelays,
onConfigChange: params.onConfigChange,
}),
}
}
function relayActionProps(params: {
setRelays: (value: RelayConfig[]) => void
setError: (value: string | null) => void
setEditingId: (value: string | null) => void
onConfigChange: RelayManagerProps['onConfigChange']
}): Pick<RelayManagerViewProps, 'onStartEditing' | 'onStopEditing' | 'onUpdateUrl' | 'onToggleEnabled' | 'onRemoveRelay'> {
return {
onStartEditing: (id) => params.setEditingId(id),
onStopEditing: () => params.setEditingId(null),
onUpdateUrl: (id, url) =>
void updateUrl({
id,
url,
setRelays: params.setRelays,
setError: params.setError,
setEditingId: params.setEditingId,
onConfigChange: params.onConfigChange,
}),
onToggleEnabled: (id, enabled) =>
void toggleEnabled({ id, enabled, setRelays: params.setRelays, setError: params.setError, onConfigChange: params.onConfigChange }),
onRemoveRelay: (id) => void removeRelay({ id, setRelays: params.setRelays, setError: params.setError, onConfigChange: params.onConfigChange }),
}
}
function dragProps(params: {
relays: RelayConfig[]
draggedId: string | null
setRelays: (value: RelayConfig[]) => void
setDraggedId: (value: string | null) => void
setDragOverId: (value: string | null) => void
setError: (value: string | null) => void
onConfigChange: RelayManagerProps['onConfigChange']
}): Pick<RelayManagerViewProps, 'onDragStart' | 'onDragOver' | 'onDragLeave' | 'onDrop' | 'onDragEnd'> {
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,
relays: params.relays,
draggedId: params.draggedId,
setRelays: params.setRelays,
setDraggedId: params.setDraggedId,
setDragOverId: params.setDragOverId,
setError: params.setError,
onConfigChange: params.onConfigChange,
}),
onDragEnd: () => params.setDraggedId(null),
}
}