import React from 'react'; import { View, ScrollView, Switch, Text } from 'react-native'; import PropTypes from 'prop-types'; import database from '../../lib/database'; import { SWITCH_TRACK_COLOR, themes } from '../../constants/colors'; import StatusBar from '../../containers/StatusBar'; import ListItem from '../../containers/ListItem'; import Separator from '../../containers/Separator'; import I18n from '../../i18n'; import scrollPersistTaps from '../../utils/scrollPersistTaps'; import styles from './styles'; import RocketChat from '../../lib/rocketchat'; import { withTheme } from '../../theme'; import protectedFunction from '../../lib/methods/helpers/protectedFunction'; import SafeAreaView from '../../containers/SafeAreaView'; import log, { events, logEvent } from '../../utils/log'; const SectionTitle = React.memo(({ title, theme }) => ( {title} )); const SectionSeparator = React.memo(({ theme }) => ( )); const Info = React.memo(({ info, theme }) => ( {info} )); SectionTitle.propTypes = { title: PropTypes.string, theme: PropTypes.string }; SectionSeparator.propTypes = { theme: PropTypes.string }; Info.propTypes = { info: PropTypes.string, theme: PropTypes.string }; const OPTIONS = { desktopNotifications: [{ label: 'Default', value: 'default' }, { label: 'All_Messages', value: 'all' }, { label: 'Mentions', value: 'mentions' }, { label: 'Nothing', value: 'nothing' }], audioNotifications: [{ label: 'Default', value: 'default' }, { label: 'All_Messages', value: 'all' }, { label: 'Mentions', value: 'mentions' }, { label: 'Nothing', value: 'nothing' }], mobilePushNotifications: [{ label: 'Default', value: 'default' }, { label: 'All_Messages', value: 'all' }, { label: 'Mentions', value: 'mentions' }, { label: 'Nothing', value: 'nothing' }], emailNotifications: [{ label: 'Default', value: 'default' }, { label: 'All_Messages', value: 'all' }, { label: 'Mentions', value: 'mentions' }, { label: 'Nothing', value: 'nothing' }], desktopNotificationDuration: [{ label: 'Default', value: 0 }, { label: 'Seconds', second: 1, value: 1 }, { label: 'Seconds', second: 2, value: 2 }, { label: 'Seconds', second: 3, value: 3 }, { label: 'Seconds', second: 4, value: 4 }, { label: 'Seconds', second: 5, value: 5 }], audioNotificationValue: [{ label: 'None', value: 'none None' }, { label: 'Default', value: '0 Default' }, { label: 'Beep', value: 'beep Beep' }, { label: 'Ding', value: 'ding Ding' }, { label: 'Chelle', value: 'chelle Chelle' }, { label: 'Droplet', value: 'droplet Droplet' }, { label: 'Highbell', value: 'highbell Highbell' }, { label: 'Seasons', value: 'seasons Seasons' }] }; class NotificationPreferencesView extends React.Component { static navigationOptions = () => ({ title: I18n.t('Notification_Preferences') }) static propTypes = { navigation: PropTypes.object, route: PropTypes.object, theme: PropTypes.string }; constructor(props) { super(props); this.mounted = false; this.rid = props.route.params?.rid; const room = props.route.params?.room; this.state = { room: room || {} }; if (room && room.observe) { this.roomObservable = room.observe(); this.subscription = this.roomObservable .subscribe((changes) => { if (this.mounted) { this.setState({ room: changes }); } else { this.state.room = changes; } }); } } componentDidMount() { this.mounted = true; } componentWillUnmount() { if (this.subscription && this.subscription.unsubscribe) { this.subscription.unsubscribe(); } } saveNotificationSettings = async(key, value, params) => { logEvent(events[`NP_${ key.toUpperCase() }`]); const { room } = this.state; const db = database.active; try { await db.action(async() => { await room.update(protectedFunction((r) => { r[key] = value; })); }); try { const result = await RocketChat.saveNotificationSettings(this.rid, params); if (result.success) { return; } } catch { // do nothing } await db.action(async() => { await room.update(protectedFunction((r) => { r[key] = room[key]; })); }); } catch (e) { logEvent(events[`NP_${ key.toUpperCase() }_F`]); log(e); } } onValueChangeSwitch = (key, value) => this.saveNotificationSettings(key, value, { [key]: value ? '1' : '0' }); onValueChangePicker = (key, value) => this.saveNotificationSettings(key, value, { [key]: value.toString() }); pickerSelection = (title, key) => { const { room } = this.state; const { navigation } = this.props; navigation.navigate('PickerView', { title, data: OPTIONS[key], value: room[key], onChangeValue: value => this.onValueChangePicker(key, value) }); } renderPickerOption = (key) => { const { room } = this.state; const { theme } = this.props; const text = room[key] ? OPTIONS[key].find(option => option.value === room[key]) : OPTIONS[key][0]; return {I18n.t(text?.label, { defaultValue: text?.label, second: text?.second })}; } renderSwitch = (key) => { const { room } = this.state; return ( this.onValueChangeSwitch(key, !value)} /> ); } render() { const { room } = this.state; const { theme } = this.props; return ( this.renderSwitch('disableNotifications')} theme={theme} /> this.renderSwitch('muteGroupMentions')} theme={theme} /> this.renderSwitch('hideUnreadStatus')} theme={theme} /> this.pickerSelection(title, 'desktopNotifications')} right={() => this.renderPickerOption('desktopNotifications')} theme={theme} /> this.pickerSelection(title, 'mobilePushNotifications')} right={() => this.renderPickerOption('mobilePushNotifications')} theme={theme} /> this.pickerSelection(title, 'audioNotifications')} right={() => this.renderPickerOption('audioNotifications')} theme={theme} /> this.pickerSelection(title, 'audioNotificationValue')} right={() => this.renderPickerOption('audioNotificationValue')} theme={theme} /> this.pickerSelection(title, 'desktopNotificationDuration')} right={() => this.renderPickerOption('desktopNotificationDuration')} theme={theme} /> this.pickerSelection(title, 'emailNotifications')} right={() => this.renderPickerOption('emailNotifications')} theme={theme} /> ); } } export default withTheme(NotificationPreferencesView);