2022-08-08 09:40:51 +01:00
/ *
2022-09-09 19:43:55 +01:00
GoToSocial
Copyright ( C ) 2021 - 2022 GoToSocial Authors admin @ gotosocial . org
2022-08-08 09:40:51 +01:00
2022-09-09 19:43:55 +01:00
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2022-08-08 09:40:51 +01:00
2022-09-09 19:43:55 +01:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
2022-08-08 09:40:51 +01:00
2022-09-09 19:43:55 +01:00
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2022-08-08 09:40:51 +01:00
* /
2022-09-07 12:51:16 +01:00
"use strict" ;
2022-08-08 09:40:51 +01:00
2022-09-09 00:39:43 +01:00
const Promise = require ( "bluebird" ) ;
const React = require ( "react" ) ;
2022-09-11 18:05:06 +01:00
const Redux = require ( "react-redux" ) ;
2022-09-09 00:39:43 +01:00
const Submit = require ( "../components/submit" ) ;
2022-09-11 18:42:13 +01:00
const api = require ( "../lib/api" ) ;
2022-09-12 18:34:04 +01:00
const formFields = require ( "../lib/form-fields" ) ;
2022-09-11 22:02:23 +01:00
const user = require ( "../redux/reducers/user" ) . actions ;
2022-09-11 18:42:13 +01:00
2022-09-11 18:05:06 +01:00
module . exports = function UserProfile ( ) {
2022-09-11 18:42:13 +01:00
const dispatch = Redux . useDispatch ( ) ;
2022-09-12 18:34:04 +01:00
const account = Redux . useSelector ( state => state . user . profile ) ;
2022-09-12 19:50:51 +01:00
const instance = Redux . useSelector ( state => state . instances . current ) ;
const allowCustomCSS = instance . configuration . accounts . allow _custom _css ;
2022-09-12 18:34:04 +01:00
const { onTextChange , onCheckChange , onFileChange } = formFields ( dispatch , user . setProfileVal , account ) ;
2022-09-11 18:05:06 +01:00
2022-09-09 00:39:43 +01:00
const [ errorMsg , setError ] = React . useState ( "" ) ;
const [ statusMsg , setStatus ] = React . useState ( "" ) ;
2022-09-12 18:34:04 +01:00
function submit ( ) {
2022-09-09 00:39:43 +01:00
setStatus ( "PATCHing" ) ;
setError ( "" ) ;
return Promise . try ( ( ) => {
2022-09-12 18:34:04 +01:00
return dispatch ( api . user . updateProfile ( ) ) ;
2022-09-11 18:42:13 +01:00
} ) . then ( ( ) => {
2022-09-09 00:39:43 +01:00
setStatus ( "Saved!" ) ;
} ) . catch ( ( e ) => {
setError ( e . message ) ;
setStatus ( "" ) ;
} ) ;
2022-09-12 18:34:04 +01:00
}
2022-09-09 00:39:43 +01:00
2022-09-12 19:50:38 +01:00
// function removeFile(name) {
// return function(e) {
// e.preventDefault();
// dispatch(user.setProfileVal([name, ""]));
// dispatch(user.setProfileVal([`${name}File`, ""]));
// };
// }
2022-09-09 00:39:43 +01:00
return (
2022-09-11 18:42:13 +01:00
< div className = "user-profile" >
2022-09-11 20:59:39 +01:00
< h1 > Profile < / h 1 >
< div className = "overview" >
< div className = "profile" >
2022-09-12 18:34:04 +01:00
< div className = "headerimage" >
< img className = "headerpreview" src = { account . header } alt = { account . header ? ` header image for ${ account . username } ` : "None set" } / >
< / d i v >
< div className = "basic" >
< div id = "profile-basic-filler2" > < / d i v >
< span className = "avatar" > < img className = "avatarpreview" src = { account . avatar } alt = { account . avatar ? ` avatar image for ${ account . username } ` : "None set" } / > < / s p a n >
< div className = "displayname" > { account . display _name . trim ( ) . length > 0 ? account . display _name : account . username } < / d i v >
< div className = "username" > < span > @ { account . username } < / s p a n > < / d i v >
< / d i v >
2022-09-11 20:59:39 +01:00
< / d i v >
< div className = "files" >
2022-09-11 18:42:13 +01:00
< div >
2022-09-11 20:59:39 +01:00
< h3 > Header < / h 3 >
2022-09-12 18:34:04 +01:00
< div className = "picker" >
< label htmlFor = "header" className = "file-input button" > Browse < / l a b e l >
< span > { account . headerFile ? account . headerFile . name : "no file selected" } < / s p a n >
< / d i v >
2022-09-12 19:50:38 +01:00
{ /* <a onClick={removeFile("header")} href="#">remove</a> */ }
2022-09-12 18:34:04 +01:00
< input className = "hidden" id = "header" type = "file" accept = "image/*" onChange = { onFileChange ( "header" ) } / >
2022-09-09 00:39:43 +01:00
< / d i v >
2022-09-11 18:42:13 +01:00
< div >
2022-09-11 20:59:39 +01:00
< h3 > Avatar < / h 3 >
2022-09-12 18:34:04 +01:00
< div className = "picker" >
< label htmlFor = "avatar" className = "file-input button" > Browse < / l a b e l >
< span > { account . avatarFile ? account . avatarFile . name : "no file selected" } < / s p a n >
< / d i v >
2022-09-12 19:50:38 +01:00
{ /* <a onClick={removeFile("avatar")} href="#">remove</a> */ }
2022-09-12 18:34:04 +01:00
< input className = "hidden" id = "avatar" type = "file" accept = "image/*" onChange = { onFileChange ( "avatar" ) } / >
2022-09-09 00:39:43 +01:00
< / d i v >
< / d i v >
2022-09-11 18:42:13 +01:00
< / d i v >
< div className = "labelinput" >
2022-09-11 20:59:39 +01:00
< label htmlFor = "displayname" > Name < / l a b e l >
2022-09-12 18:34:04 +01:00
< input id = "displayname" type = "text" value = { account . display _name } onChange = { onTextChange ( "display_name" ) } placeholder = "A GoToSocial user" / >
2022-09-11 18:42:13 +01:00
< / d i v >
< div className = "labelinput" >
< label htmlFor = "bio" > Bio < / l a b e l >
2022-09-12 18:34:04 +01:00
< textarea id = "bio" value = { account . source . note } onChange = { onTextChange ( "source.note" ) } placeholder = "Just trying out GoToSocial, my pronouns are they/them and I like sloths." / >
2022-09-11 18:42:13 +01:00
< / d i v >
< div className = "labelcheckbox" >
2022-09-11 20:59:39 +01:00
< label htmlFor = "locked" > Manually approve follow requests ? < / l a b e l >
2022-09-12 18:34:04 +01:00
< input id = "locked" type = "checkbox" checked = { account . locked } onChange = { onCheckChange ( "locked" ) } / >
2022-09-11 18:42:13 +01:00
< / d i v >
2022-09-12 19:50:51 +01:00
{ ! allowCustomCSS ? null :
< div className = "labelinput" >
< label htmlFor = "customcss" > Custom CSS < / l a b e l >
< textarea className = "mono" id = "customcss" value = { account . custom _css } onChange = { onTextChange ( "custom_css" ) } / >
< 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 >
< / d i v >
}
2022-09-12 18:34:04 +01:00
< Submit onClick = { submit } label = "Save profile info" errorMsg = { errorMsg } statusMsg = { statusMsg } / >
2022-09-11 18:42:13 +01:00
< / d i v >
2022-09-09 00:39:43 +01:00
) ;
2022-09-07 12:51:16 +01:00
} ;