import { usePrivateUser } from 'web/hooks/use-user' import React, { ReactNode, useEffect, useState } from 'react' import { LoadingIndicator } from 'web/components/loading-indicator' import { Row } from 'web/components/layout/row' import clsx from 'clsx' import { notification_subscription_types, notification_destination_types, } from 'common/user' import { updatePrivateUser } from 'web/lib/firebase/users' import { Switch } from '@headlessui/react' import { Col } from 'web/components/layout/col' import { CashIcon, ChatIcon, ChevronDownIcon, ChevronUpIcon, CurrencyDollarIcon, InboxInIcon, InformationCircleIcon, LightBulbIcon, TrendingUpIcon, UserIcon, UsersIcon, } from '@heroicons/react/outline' import { WatchMarketModal } from 'web/components/contract/watch-market-modal' import { filterDefined } from 'common/util/array' import toast from 'react-hot-toast' export function NotificationSettings() { const privateUser = usePrivateUser() const [showWatchModal, setShowWatchModal] = useState(false) if (!privateUser || !privateUser.notificationSubscriptionTypes) { return } const emailsEnabled: Array = [ 'all_comments_on_watched_markets', 'all_replies_to_my_comments_on_watched_markets', 'all_comments_on_contracts_with_shares_in_on_watched_markets', 'all_answers_on_watched_markets', 'all_replies_to_my_answers_on_watched_markets', 'all_answers_on_contracts_with_shares_in_on_watched_markets', 'your_contract_closed', 'all_comments_on_my_markets', 'all_answers_on_my_markets', 'resolutions_on_watched_markets_with_shares_in', 'resolutions_on_watched_markets', 'tagged_user', 'trending_markets', // TODO: add these // 'contract_from_followed_user', // 'referral_bonuses', // 'unique_bettors_on_your_contract', // 'tips_on_your_markets', // 'tips_on_your_comments', // 'subsidized_your_market', // 'on_new_follow', // maybe the following? // 'profit_loss_updates', // 'probability_updates_on_watched_markets', // 'limit_order_fills', ] const browserDisabled = ['trending_markets', 'profit_loss_updates'] const watched_markets_explanations_comments: { [key in keyof Partial]: string } = { all_comments_on_watched_markets: 'All', all_replies_to_my_comments_on_watched_markets: 'Replies to your comments', all_comments_on_contracts_with_shares_in_on_watched_markets: 'On markets you have shares in', // comments_by_followed_users_on_watched_markets: 'By followed users', } const watched_markets_explanations_answers: { [key in keyof Partial]: string } = { all_answers_on_watched_markets: 'All', all_replies_to_my_answers_on_watched_markets: 'Replies to your answers', all_answers_on_contracts_with_shares_in_on_watched_markets: 'On markets you have shares in', // answers_by_followed_users_on_watched_markets: 'By followed users', // answers_by_market_creator_on_watched_markets: 'By market creator', } const watched_markets_explanations_your_markets: { [key in keyof Partial]: string } = { your_contract_closed: 'Your market has closed (and needs resolution)', all_comments_on_my_markets: 'Comments on your markets', all_answers_on_my_markets: 'Answers on your markets', subsidized_your_market: 'Your market was subsidized', tips_on_your_markets: 'Likes on your markets', } const watched_markets_explanations_market_updates: { [key in keyof Partial]: string } = { market_updates_on_watched_markets: 'Updates made by the creator', market_updates_on_watched_markets_with_shares_in: 'Updates made by the creator on markets you have shares in', resolutions_on_watched_markets: 'Market resolutions', resolutions_on_watched_markets_with_shares_in: 'Market resolutions you have shares in', // probability_updates_on_watched_markets: 'Probability updates', } const bonuses_explanations: { [key in keyof Partial]: string } = { betting_streaks: 'Betting streak bonuses', referral_bonuses: 'Referral bonuses from referring users', unique_bettors_on_your_contract: 'Unique bettor bonuses on your markets', } const other_balance_change_explanations: { [key in keyof Partial]: string } = { loan_income: 'Automatic loans from your profitable bets', limit_order_fills: 'Limit order fills', tips_on_your_comments: 'Tips on your comments', } const general_explanations: { [key in keyof Partial]: string } = { tagged_user: 'A user tagged you', trending_markets: 'Weekly trending markets', // profit_loss_updates: 'Weekly profit/loss updates', } const follows_and_followers_explanations: { [key in keyof Partial]: string } = { on_new_follow: 'New followers', contract_from_followed_user: 'New markets created by users you follow', } const NotificationSettingLine = ( description: string, key: keyof notification_subscription_types, value: notification_destination_types[] ) => { const previousInAppValue = value.includes('browser') const previousEmailValue = value.includes('email') const [inAppEnabled, setInAppEnabled] = useState(previousInAppValue) const [emailEnabled, setEmailEnabled] = useState(previousEmailValue) const loading = 'Changing Notifications Settings' const success = 'Changed Notification Settings!' useEffect(() => { if ( inAppEnabled !== previousInAppValue || emailEnabled !== previousEmailValue ) { toast.promise( updatePrivateUser(privateUser.id, { notificationSubscriptionTypes: { ...privateUser.notificationSubscriptionTypes, [key]: filterDefined([ inAppEnabled ? 'browser' : undefined, emailEnabled ? 'email' : undefined, ]), }, }), { success, loading, error: 'Error changing notification settings. Try again?', } ) } }, [ inAppEnabled, emailEnabled, previousInAppValue, previousEmailValue, key, ]) return ( {description} {!browserDisabled.includes(key) && ( In-app )} {emailsEnabled.includes(key) && ( Emails )} ) } const getUsersSavedPreference = ( key: keyof notification_subscription_types ) => { return privateUser.notificationSubscriptionTypes[key] ?? [] } const Section = ( icon: ReactNode, label: string, subscriptionTypeToDescription: { [key in keyof Partial]: string } ) => { const [expanded, setExpanded] = useState(false) return ( setExpanded(!expanded)} > {icon} {label} {expanded ? ( Hide ) : ( Show )} {Object.entries(subscriptionTypeToDescription).map(([key, value]) => NotificationSettingLine( value, key as keyof notification_subscription_types, getUsersSavedPreference( key as keyof notification_subscription_types ) ) )} ) } return (
Notifications for Watched Markets setShowWatchModal(true)} /> {Section( , 'New Comments', watched_markets_explanations_comments )} {Section( , 'New Answers', watched_markets_explanations_answers )} {Section( , 'Updates & Resolutions', watched_markets_explanations_market_updates )} {Section( , 'Markets You Created', watched_markets_explanations_your_markets )} Balance Changes {Section( , 'Bonuses', bonuses_explanations )} {Section( , 'Other', other_balance_change_explanations )} General {Section( , 'Follows & Followers', follows_and_followers_explanations )} {Section( , 'Other', general_explanations )}
) }