Files
omnivore/packages/web/lib/hooks/useSetHighlightLabels.tsx
2023-06-21 13:55:20 +08:00

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]
}