diff options
author | 2022-09-12 13:14:29 +0200 | |
---|---|---|
committer | 2022-09-12 13:14:29 +0200 | |
commit | b42469e4e06d82a0e458b94379e226257ba3ca6c (patch) | |
tree | f4df0740ff0378dd4d3691cac4e942ea0a22eb5a /web/source/panels/user/basic.js | |
parent | [feature] Fetch + display custom emoji in statuses from remote instances (#807) (diff) | |
download | gotosocial-b42469e4e06d82a0e458b94379e226257ba3ca6c.tar.xz |
[feature] Allow users to set custom css for their profiles + threads (#808)
* add custom css account property + db func to fetch
* allow account to get/set custom css
* serve custom css for an account
* go fmt
* use monospace for customcss, add link
* add custom css to account cache
* fix broken field
* add custom css docs to user guide
* add `accounts-allow-custom-css` config flag
* add allow custom css to /api/v1/instance response
* only show/set custom css if allowed to do so
* only set/serve custom account css if enabled
* update swagger docs
* chain promise
* make bool a bit clearer
* use cache for GetAccountCustomCSSByUsername
Diffstat (limited to 'web/source/panels/user/basic.js')
-rw-r--r-- | web/source/panels/user/basic.js | 20 |
1 files changed, 17 insertions, 3 deletions
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)}/> |