import './settings.css'; import { useEffect, useRef, useState } from 'preact/hooks'; import { useSnapshot } from 'valtio'; import logo from '../assets/logo.svg'; import Icon from '../components/icon'; import RelativeTime from '../components/relative-time'; import targetLanguages from '../data/lingva-target-languages'; import { api } from '../utils/api'; import getTranslateTargetLanguage from '../utils/get-translate-target-language'; import localeCode2Text from '../utils/localeCode2Text'; import states from '../utils/states'; import store from '../utils/store'; const DEFAULT_TEXT_SIZE = 16; const TEXT_SIZES = [16, 17, 18, 19, 20]; function Settings({ onClose }) { const snapStates = useSnapshot(states); const currentTheme = store.local.get('theme') || 'auto'; const themeFormRef = useRef(); const targetLanguage = snapStates.settings.contentTranslationTargetLanguage || null; const systemTargetLanguage = getTranslateTargetLanguage(); const systemTargetLanguageText = localeCode2Text(systemTargetLanguage); const currentTextSize = store.local.get('textSize') || DEFAULT_TEXT_SIZE; const [prefs, setPrefs] = useState(store.account.get('preferences') || {}); // Get preferences every time Settings is opened // NOTE: Disabled for now because I don't expect this to change often. Also for some reason, the /api/v1/preferences endpoint is cached for a while and return old prefs if refresh immediately after changing them. // useEffect(() => { // const { masto } = api(); // (async () => { // try { // const preferences = await masto.v1.preferences.fetch(); // setPrefs(preferences); // store.account.set('preferences', preferences); // } catch (e) { // // Silently fail // console.error(e); // } // })(); // }, []); return (
{!!onClose && ( )}

Settings

  • { console.log(e); e.preventDefault(); const formData = new FormData(themeFormRef.current); const theme = formData.get('theme'); const html = document.documentElement; if (theme === 'auto') { html.classList.remove('is-light', 'is-dark'); } else { html.classList.toggle('is-light', theme === 'light'); html.classList.toggle('is-dark', theme === 'dark'); } document .querySelector('meta[name="color-scheme"]') .setAttribute( 'content', theme === 'auto' ? 'dark light' : theme, ); if (theme === 'auto') { store.local.del('theme'); } else { store.local.set('theme', theme); } }} >
  • A{' '} { const value = parseInt(e.target.value, 10); const html = document.documentElement; // set CSS variable html.style.setProperty('--text-size', `${value}px`); // save to local storage if (value === DEFAULT_TEXT_SIZE) { store.local.del('textSize'); } else { store.local.set('textSize', e.target.value); } }} />{' '} A {TEXT_SIZES.map((size) => (

Posting

Experiments


  • Hide "Translate" button for {snapStates.settings.contentTranslationHideLanguages.length > 0 && ( <> {' '} ( { snapStates.settings.contentTranslationHideLanguages .length } ) )} :

    {targetLanguages.map((lang) => ( ))}

    Note: This feature uses an external API to translate, powered by{' '} Lingva Translate .


    Automatically show translation for posts in timeline. Only works for short posts without content warning, media and poll.

  • Replace text as blocks, useful when taking screenshots, for privacy reasons.

About

Phanpy{' '} { e.preventDefault(); states.showAccount = 'phanpy@hachyderm.io'; }} > @phanpy
Built {' '} by{' '} { e.preventDefault(); states.showAccount = 'cheeaun@mastodon.social'; }} > @cheeaun

Privacy Policy

{__BUILD_TIME__ && (

Last build:{' '} {' '} {__COMMIT_HASH__ && ( <> ( {__COMMIT_HASH__} ) )}

)}
); } export default Settings;