131 lines
4.7 KiB
TypeScript
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),
|
|
}
|
|
}
|