-
- {notificationTypes.map(({type, question}) => (
- {
- setPrefs((prevPrefs) => ({...prevPrefs, [type]: selected}))
- }}
- />
- ))}
-
-
- )
-}
-
-const NotificationOption = (props: {
- type: notification_preference
- question: string
- selected: notification_destination_types[]
- onUpdate: (selected: notification_destination_types[]) => void
-}) => {
- const {type, question, selected, onUpdate} = props
-
- const getSelectedValues = (destinations: string[]) => {
- const values: number[] = []
- if ((destinations ?? []).includes('email')) values.push(0)
- if ((destinations ?? []).includes('browser')) values.push(1)
- return values
- }
-
- const setValue = async (value: number[]) => {
- const newDestinations: notification_destination_types[] = []
- if (value.includes(0)) newDestinations.push('email')
- if (value.includes(1)) newDestinations.push('browser')
-
- onUpdate(newDestinations)
- save(selected, newDestinations)
- }
-
- const save = useCallback(
- debounce(
- (
- oldDestinations: notification_destination_types[],
- newDestinations: notification_destination_types[]
- ) => {
- // for each medium, if it changed, trigger a save
- const mediums = ['email', 'browser'] as const
- mediums.forEach((medium) => {
- const wasEnabled = oldDestinations.includes(medium)
- const isEnabled = newDestinations.includes(medium)
- if (wasEnabled !== isEnabled) {
- api('update-notif-settings', {
- type,
- medium,
- enabled: isEnabled,
- })
- }
- })
- },
- 500
- ),
- []
- )
-
- return (
-