summaryrefslogtreecommitdiff
path: root/web/source
diff options
context:
space:
mode:
Diffstat (limited to 'web/source')
-rw-r--r--web/source/panels/base.css4
-rw-r--r--web/source/panels/user/basic.js20
-rw-r--r--web/source/panels/user/index.js22
3 files changed, 39 insertions, 7 deletions
diff --git a/web/source/panels/base.css b/web/source/panels/base.css
index d0e242505..2d76ed080 100644
--- a/web/source/panels/base.css
+++ b/web/source/panels/base.css
@@ -61,3 +61,7 @@ input, select, textarea {
rgb(70, 79, 88) 20px
) !important;
}
+
+.mono {
+ font-family: monospace;
+}
diff --git a/web/source/panels/user/basic.js b/web/source/panels/user/basic.js
index 29728c0b3..f507b782b 100644
--- a/web/source/panels/user/basic.js
+++ b/web/source/panels/user/basic.js
@@ -23,7 +23,7 @@ const Promise = require("bluebird");
const Submit = require("../../lib/submit");
-module.exports = function Basic({oauth, account}) {
+module.exports = function Basic({oauth, account, allowCustomCSS}) {
const [errorMsg, setError] = React.useState("");
const [statusMsg, setStatus] = React.useState("");
@@ -36,6 +36,7 @@ module.exports = function Basic({oauth, account}) {
const [displayName, setDisplayName] = React.useState("");
const [bio, setBio] = React.useState("");
const [locked, setLocked] = React.useState(false);
+ const [customCSS, setCustomCSS] = React.useState("");
React.useEffect(() => {
setHeaderSrc(account.header);
@@ -44,7 +45,8 @@ module.exports = function Basic({oauth, account}) {
setDisplayName(account.display_name);
setBio(account.source ? account.source.note : "");
setLocked(account.locked);
- }, [account, setHeaderSrc, setAvatarSrc, setDisplayName, setBio, setLocked]);
+ setCustomCSS((allowCustomCSS && account.custom_css) ? account.custom_css : "");
+ }, [account, setHeaderSrc, setAvatarSrc, setDisplayName, setBio, setLocked, setCustomCSS]);
const headerOnChange = (e) => {
setHeaderFile(e.target.files[0]);
@@ -75,7 +77,11 @@ module.exports = function Basic({oauth, account}) {
formDataInfo.set("display_name", displayName);
formDataInfo.set("note", bio);
formDataInfo.set("locked", locked);
-
+
+ if (allowCustomCSS) {
+ formDataInfo.set("custom_css", customCSS);
+ }
+
return oauth.apiRequest("/api/v1/accounts/update_credentials", "PATCH", formDataInfo, "form");
}).then((json) => {
setStatus("Saved!");
@@ -86,6 +92,7 @@ module.exports = function Basic({oauth, account}) {
setDisplayName(json.display_name);
setBio(json.source.note);
setLocked(json.locked);
+ setCustomCSS(allowCustomCSS && json.custom_css ? json.custom_css : "");
}).catch((e) => {
setError(e.message);
setStatus("");
@@ -126,6 +133,13 @@ module.exports = function Basic({oauth, account}) {
<label htmlFor="bio">Bio</label>
<textarea id="bio" value={bio} onChange={(e) => setBio(e.target.value)} placeholder="Just trying out GoToSocial, my pronouns are they/them and I like sloths."/>
</div>
+ { !allowCustomCSS ? null :
+ <div className="labelinput">
+ <label htmlFor="customcss">Custom CSS</label>
+ <textarea className="mono" id="customcss" value={customCSS} onChange={(e) => setCustomCSS(e.target.value)}/>
+ <a href="https://docs.gotosocial.org/en/latest/user_guide/custom_css" target="_blank" className="moreinfolink" rel="noreferrer">Learn more about custom CSS (opens in a new tab)</a>
+ </div>
+ }
<div className="labelcheckbox">
<label htmlFor="locked">Manually approve follow requests</label>
<input id="locked" type="checkbox" checked={locked} onChange={(e) => setLocked(e.target.checked)}/>
diff --git a/web/source/panels/user/index.js b/web/source/panels/user/index.js
index bb8b263d6..aeecac415 100644
--- a/web/source/panels/user/index.js
+++ b/web/source/panels/user/index.js
@@ -33,26 +33,40 @@ require("./style.css");
function UserPanel({oauth}) {
const [account, setAccount] = React.useState({});
+ const [allowCustomCSS, setAllowCustomCSS] = React.useState(false);
const [errorMsg, setError] = React.useState("");
const [statusMsg, setStatus] = React.useState("Fetching user info");
React.useEffect(() => {
+
+ }, [oauth, setAllowCustomCSS, setError, setStatus]);
+
+ React.useEffect(() => {
Promise.try(() => {
- return oauth.apiRequest("/api/v1/accounts/verify_credentials", "GET");
+ return oauth.apiRequest("/api/v1/instance", "GET");
}).then((json) => {
- setAccount(json);
+ setAllowCustomCSS(json.configuration.accounts.allow_custom_css);
+ Promise.try(() => {
+ return oauth.apiRequest("/api/v1/accounts/verify_credentials", "GET");
+ }).then((json) => {
+ setAccount(json);
+ }).catch((e) => {
+ setError(e.message);
+ setStatus("");
+ });
}).catch((e) => {
setError(e.message);
setStatus("");
});
- }, [oauth, setAccount, setError, setStatus]);
+
+ }, [oauth, setAllowCustomCSS, setAccount, setError, setStatus]);
return (
<React.Fragment>
<div>
<button className="logout" onClick={oauth.logout}>Log out of settings panel</button>
</div>
- <Basic oauth={oauth} account={account}/>
+ <Basic oauth={oauth} account={account} allowCustomCSS={allowCustomCSS}/>
<Posts oauth={oauth} account={account}/>
<Security oauth={oauth}/>
</React.Fragment>