snort/packages/app/src/Pages/settings/Preferences.tsx

435 lines
14 KiB
TypeScript
Raw Normal View History

2023-02-08 21:10:26 +00:00
import "./Preferences.css";
2023-02-11 18:26:51 +00:00
import { FormattedMessage, useIntl } from "react-intl";
2023-03-03 22:01:15 +00:00
import { Link } from "react-router-dom";
2023-02-11 18:26:51 +00:00
import emoji from "@jukben/emoji-search";
2023-02-08 21:10:26 +00:00
2023-04-14 11:33:19 +00:00
import useLogin from "Hooks/useLogin";
import { DefaultPreferences, updatePreferences, UserPreferences } from "Login";
2023-04-14 11:33:19 +00:00
import { DefaultImgProxy } from "Const";
2023-02-11 18:26:51 +00:00
import { unwrap } from "Util";
2023-02-08 21:10:26 +00:00
import messages from "./messages";
2023-01-20 17:07:14 +00:00
const PreferencesPage = () => {
2023-02-11 18:26:51 +00:00
const { formatMessage } = useIntl();
2023-04-14 11:33:19 +00:00
const login = useLogin();
const perf = login.preferences;
2023-01-20 17:07:14 +00:00
return (
<div className="preferences">
2023-02-08 21:10:26 +00:00
<h3>
<FormattedMessage {...messages.Preferences} />
</h3>
2023-01-20 17:07:14 +00:00
2023-02-27 11:31:46 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage defaultMessage="Language" />
</div>
</div>
<div>
<select
value={perf.language || DefaultPreferences.language}
2023-02-27 11:31:46 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
language: e.target.value,
})
2023-02-27 11:31:46 +00:00
}
style={{ textTransform: "capitalize" }}>
2023-04-18 11:32:03 +00:00
{["en", "ja", "es", "hu", "zh-CN", "zh-TW", "fr", "ar", "it", "id", "de", "ru", "sv", "hr", "ta-IN"]
New Crowdin updates (#508) * New translations en.json (Danish) * New translations en.json (Dutch) * New translations en.json (Swedish) * New translations en.json (Croatian) * New translations en.json (Swedish) * New translations en.json (Croatian) * New translations en.json (French) * New translations en.json (Russian) * New translations en.json (Danish) * New translations en.json (Dutch) * New translations en.json (Swedish) * New translations en.json (Croatian) * New translations en.json (French) * New translations en.json (Russian) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (German) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Indonesian) * New translations en.json (Swedish) * New translations en.json (Russian) * New translations en.json (Russian) * New translations en.json (Croatian) * New translations en.json (Russian) * New translations en.json (Spanish) * New translations en.json (Italian) * New translations en.json (Croatian) * New translations en.json (Russian) * New translations en.json (Russian) * New translations en.json (Russian) * New translations en.json (Croatian) * New translations en.json (Russian) * New translations en.json (Italian) * New translations en.json (Hungarian) * New translations en.json (Russian) * New translations en.json (Arabic) * New translations en.json (Arabic) * Add hr/sv
2023-04-13 09:00:09 +00:00
.sort()
.map(a => (
<option value={a}>
{new Intl.DisplayNames([a], {
type: "language",
}).of(a)}
</option>
))}
2023-02-27 11:31:46 +00:00
</select>
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.Theme} />
</div>
</div>
<div>
<select
value={perf.theme}
2023-02-09 12:26:54 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
theme: e.target.value,
} as UserPreferences)
2023-02-09 12:26:54 +00:00
}>
2023-02-08 21:10:26 +00:00
<option value="system">
<FormattedMessage {...messages.System} />
</option>
<option value="light">
<FormattedMessage {...messages.Light} />
</option>
<option value="dark">
<FormattedMessage {...messages.Dark} />
</option>
</select>
</div>
</div>
2023-02-17 15:05:15 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage {...messages.DefaultRootTab} />
</div>
2023-02-16 14:13:36 +00:00
</div>
2023-02-17 15:05:15 +00:00
<div>
<select
value={perf.defaultRootTab}
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
defaultRootTab: e.target.value,
} as UserPreferences)
2023-02-17 15:05:15 +00:00
}>
<option value="posts">
<FormattedMessage {...messages.Posts} />
</option>
<option value="conversations">
<FormattedMessage {...messages.Conversations} />
</option>
<option value="global">
<FormattedMessage {...messages.Global} />
</option>
</select>
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.AutoloadMedia} />
</div>
<small>
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.AutoloadMediaHelp} />
</small>
2023-02-12 20:19:31 +00:00
<div className="mt10">
<select
value={perf.autoLoadMedia}
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
autoLoadMedia: e.target.value,
} as UserPreferences)
2023-02-12 20:19:31 +00:00
}>
<option value="none">
<FormattedMessage {...messages.None} />
</option>
<option value="follows-only">
<FormattedMessage {...messages.FollowsOnly} />
</option>
<option value="all">
<FormattedMessage {...messages.All} />
</option>
</select>
</div>
</div>
</div>
2023-02-24 23:03:01 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage defaultMessage="Default Zap amount" />
</div>
</div>
<div>
<input
type="number"
defaultValue={perf.defaultZapAmount}
2023-02-24 23:03:01 +00:00
min={1}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, defaultZapAmount: parseInt(e.target.value || "0") })}
2023-02-24 23:03:01 +00:00
/>
</div>
</div>
2023-03-03 22:01:15 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage defaultMessage="Fast Zap Donation" />
</div>
<small>
<FormattedMessage
defaultMessage="For each Fast Zap an additional {percentage}% ({amount} sats) of the zap amount will be sent to the Snort developers as a donation."
values={{
percentage: perf.fastZapDonate * 100,
amount: Math.floor(perf.defaultZapAmount * perf.fastZapDonate),
}}
/>
<br />
<FormattedMessage
defaultMessage="For more information about donations see {link}."
values={{
link: (
<Link to="/donate">
<FormattedMessage defaultMessage="Donate Page" />
</Link>
),
}}
/>
</small>
</div>
<div>
<input
type="number"
defaultValue={perf.fastZapDonate * 100}
2023-03-03 22:01:15 +00:00
min={0}
max={100}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, fastZapDonate: parseInt(e.target.value || "0") / 100 })}
2023-03-03 22:01:15 +00:00
/>
</div>
</div>
2023-03-10 23:52:39 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage defaultMessage="Auto Zap" />
</div>
<small>
<FormattedMessage defaultMessage="Automatically zap every note when loaded" />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.autoZap}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, autoZap: e.target.checked })}
2023-03-10 23:52:39 +00:00
/>
</div>
</div>
<div className="card flex f-col">
<div className="flex w-max">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ImgProxy} />
</div>
<small>
<FormattedMessage {...messages.ImgProxyHelp} />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.imgProxyConfig !== null}
2023-02-09 12:26:54 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
imgProxyConfig: e.target.checked ? DefaultImgProxy : null,
})
}
/>
</div>
</div>
{perf.imgProxyConfig && (
<div className="w-max mt10 form">
<div className="form-group">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ServiceUrl} />
</div>
<div className="w-max">
<input
type="text"
value={perf.imgProxyConfig?.url}
2023-02-11 18:26:51 +00:00
placeholder={formatMessage({
defaultMessage: "URL..",
description: "Placeholder text for imgproxy url textbox",
})}
2023-02-09 12:26:54 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
imgProxyConfig: {
...unwrap(perf.imgProxyConfig),
url: e.target.value,
},
})
}
/>
</div>
2023-01-21 16:09:35 +00:00
</div>
<div className="form-group">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ServiceKey} />
</div>
<div className="w-max">
<input
type="password"
value={perf.imgProxyConfig?.key}
2023-02-11 18:26:51 +00:00
placeholder={formatMessage({
defaultMessage: "Hex Key..",
description: "Hexidecimal 'key' input for improxy",
})}
2023-02-09 12:26:54 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
imgProxyConfig: {
...unwrap(perf.imgProxyConfig),
key: e.target.value,
},
})
}
/>
</div>
2023-01-23 17:36:49 +00:00
</div>
<div className="form-group">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ServiceSalt} />
</div>
<div className="w-max">
<input
type="password"
value={perf.imgProxyConfig?.salt}
2023-02-11 18:26:51 +00:00
placeholder={formatMessage({
defaultMessage: "Hex Salt..",
description: "Hexidecimal 'salt' input for imgproxy",
})}
2023-02-09 12:26:54 +00:00
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
imgProxyConfig: {
...unwrap(perf.imgProxyConfig),
salt: e.target.value,
},
})
}
/>
</div>
2023-01-21 17:00:09 +00:00
</div>
</div>
)}
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.EnableReactions} />
</div>
<small>
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.EnableReactionsHelp} />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.enableReactions}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, enableReactions: e.target.checked })}
/>
</div>
</div>
2023-02-10 19:23:52 +00:00
<div className="card flex">
<div className="flex f-col f-grow">
<div>
<FormattedMessage {...messages.ReactionEmoji} />
</div>
<small>
<FormattedMessage {...messages.ReactionEmojiHelp} />
</small>
2023-02-12 20:19:31 +00:00
<div className="mt10">
<select
className="emoji-selector"
value={perf.reactionEmoji}
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
reactionEmoji: e.target.value,
})
2023-02-12 20:19:31 +00:00
}>
<option value="+">
+ <FormattedMessage {...messages.Default} />
</option>
{emoji("").map(({ name, char }) => {
return (
<option value={char}>
{name} {char}
</option>
);
})}
</select>
</div>
2023-02-10 19:23:52 +00:00
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ConfirmReposts} />
</div>
<small>
<FormattedMessage {...messages.ConfirmRepostsHelp} />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.confirmReposts}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, confirmReposts: e.target.checked })}
/>
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.ShowLatest} />
</div>
<small>
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.ShowLatestHelp} />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.autoShowLatest}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, autoShowLatest: e.target.checked })}
/>
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.FileUpload} />
</div>
<small>
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.FileUploadHelp} />
</small>
2023-02-12 20:19:31 +00:00
<div className="mt10">
<select
value={perf.fileUploader}
onChange={e =>
2023-04-14 11:33:19 +00:00
updatePreferences(login, {
...perf,
fileUploader: e.target.value,
} as UserPreferences)
2023-02-12 20:19:31 +00:00
}>
<option value="void.cat">
void.cat <FormattedMessage {...messages.Default} />
</option>
<option value="nostr.build">nostr.build</option>
<option value="nostrimg.com">nostrimg.com</option>
</select>
</div>
</div>
</div>
<div className="card flex">
<div className="flex f-col f-grow">
2023-02-08 21:10:26 +00:00
<div>
<FormattedMessage {...messages.DebugMenus} />
</div>
<small>
2023-02-08 21:10:26 +00:00
<FormattedMessage {...messages.DebugMenusHelp} />
</small>
</div>
<div>
<input
type="checkbox"
checked={perf.showDebugMenus}
2023-04-14 11:33:19 +00:00
onChange={e => updatePreferences(login, { ...perf, showDebugMenus: e.target.checked })}
/>
2023-01-20 17:07:14 +00:00
</div>
</div>
</div>
);
};
export default PreferencesPage;