import { Toast } from 'bootstrap'; import classNames from 'classnames'; import React, { useEffect, useRef, useState } from 'react'; import config, { SuccessOrFailType } from '../config/config'; import apiKeyInvalid from '../utils/apiKey'; import { logUserIn } from '../utils/user'; import SitesList from './SitesList'; interface State { alertText: string; alertType: SuccessOrFailType; apiKey: string; apiUrl: string; blacklist: string; hostname: string; loading: boolean; loggingStyle: string; loggingType: string; socialMediaSites: string[]; theme: string; trackSocialMedia: boolean; whitelist: string; } export default function Options(): JSX.Element { const [state, setState] = useState({ alertText: config.alert.success.text, alertType: config.alert.success.type, apiKey: '', apiUrl: config.apiUrl, blacklist: '', hostname: '', loading: false, loggingStyle: config.loggingStyle, loggingType: config.loggingType, socialMediaSites: config.socialMediaSites, theme: config.theme, trackSocialMedia: config.trackSocialMedia, whitelist: '', }); const liveToastRef = useRef(null); const loggingStyleRef = useRef(null); const restoreSettings = async (): Promise => { const items = await browser.storage.sync.get({ apiKey: config.apiKey, apiUrl: config.apiUrl, blacklist: '', hostname: config.hostname, loggingStyle: config.loggingStyle, loggingType: config.loggingType, socialMediaSites: config.socialMediaSites, theme: config.theme, trackSocialMedia: true, whitelist: '', }); // Handle prod accounts with old social media stored as string if (typeof items.socialMediaSites === 'string') { await browser.storage.sync.set({ socialMediaSites: items.socialMediaSites.split('\n'), }); items.socialMediaSites = items.socialMediaSites.split('\n'); } setState({ ...state, apiKey: items.apiKey as string, apiUrl: items.apiUrl as string, blacklist: items.blacklist as string, hostname: items.hostname as string, loggingStyle: items.loggingStyle as string, loggingType: items.loggingType as string, socialMediaSites: items.socialMediaSites as string[], theme: items.theme as string, trackSocialMedia: items.trackSocialMedia as boolean, whitelist: items.whitelist as string, }); }; useEffect(() => { void restoreSettings(); }, []); const handleSubmit = async () => { if (state.loading) return; setState({ ...state, loading: true }); const apiKey = state.apiKey; const theme = state.theme; const hostname = state.hostname; const loggingType = state.loggingType; const loggingStyle = state.loggingStyle; const trackSocialMedia = state.trackSocialMedia; const socialMediaSites = state.socialMediaSites; // Trimming blacklist and whitelist removes blank lines and spaces. const blacklist = state.blacklist.trim(); const whitelist = state.whitelist.trim(); let apiUrl = state.apiUrl; if (apiUrl.endsWith('/')) { apiUrl = apiUrl.slice(0, -1); } // Sync options with google storage. await browser.storage.sync.set({ apiKey, apiUrl, blacklist, hostname, loggingStyle, loggingType, socialMediaSites, theme, trackSocialMedia, whitelist, }); // Set state to be newly entered values. setState({ ...state, apiKey, apiUrl, blacklist, hostname, loggingStyle, loggingType, socialMediaSites, theme, trackSocialMedia, whitelist, }); // eslint-disable-next-line Toast.getOrCreateInstance(liveToastRef?.current ?? '')?.show(); await logUserIn(state.apiKey); }; const updateBlacklistState = (sites: string) => { setState({ ...state, blacklist: sites, }); }; const updateWhitelistState = (sites: string) => { setState({ ...state, whitelist: sites, }); }; const toggleSocialMedia = () => { setState({ ...state, trackSocialMedia: !state.trackSocialMedia }); }; const loggingStyle = function () { if (state.loggingStyle == 'blacklist') { return ( ); } return ( ); }; const isApiKeyValid = apiKeyInvalid(state.apiKey) === ''; return (
setState({ ...state, apiKey: e.target.value })} />
{loggingStyle()}
setState({ ...state, hostname: e.target.value })} /> Optional name of local machine. By default 'Unknown Hostname'.
setState({ ...state, apiUrl: e.target.value })} placeholder="https://api.wakatime.com/api/v1" /> https://api.wakatime.com/api/v1
Track social media sites
); }