65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import { useReducer } from 'react'
|
|
import { Label } from '../networking/fragments/labelFragment'
|
|
import { showErrorToast } from '../toastHelpers'
|
|
import { setLabelsForHighlight } from '../networking/mutations/setLabelsForHighlight'
|
|
import { LabelsDispatcher } from './useSetPageLabels'
|
|
|
|
export const useSetHighlightLabels = (
|
|
highlightId?: string
|
|
): [{ labels: Label[] }, LabelsDispatcher] => {
|
|
const labelsReducer = (
|
|
state: {
|
|
labels: Label[]
|
|
},
|
|
action: {
|
|
type: string
|
|
labels: Label[]
|
|
}
|
|
) => {
|
|
switch (action.type) {
|
|
case 'RESET': {
|
|
return {
|
|
labels: action.labels,
|
|
}
|
|
}
|
|
case 'TEMP': {
|
|
return {
|
|
labels: action.labels,
|
|
}
|
|
}
|
|
case 'SAVE': {
|
|
const labelIds = action.labels.map((l) => l.id)
|
|
if (highlightId) {
|
|
;(async () => {
|
|
const result = await setLabelsForHighlight(highlightId, labelIds)
|
|
if (result) {
|
|
dispatchLabels({
|
|
type: 'RESET',
|
|
// Use original list so we don't reorder
|
|
labels: action.labels ?? [],
|
|
})
|
|
} else {
|
|
showErrorToast('Error saving labels', {
|
|
position: 'bottom-right',
|
|
})
|
|
}
|
|
})()
|
|
} else {
|
|
showErrorToast('Unable to update labels')
|
|
}
|
|
return {
|
|
labels: action.labels,
|
|
}
|
|
}
|
|
default:
|
|
return state
|
|
}
|
|
}
|
|
|
|
const [labels, dispatchLabels] = useReducer(labelsReducer, {
|
|
labels: [],
|
|
})
|
|
|
|
return [labels, dispatchLabels]
|
|
}
|