Add profile edit page

This commit is contained in:
r 2023-10-01 13:04:07 +00:00
parent 8e3999fc3d
commit 81bdc7c705
9 changed files with 314 additions and 25 deletions

View file

@ -774,6 +774,55 @@ func (svc *service) FiltersPage(c *client) (err error) {
return svc.renderer.Render(c.rctx, c.w, renderer.FiltersPage, data)
}
func (svc *service) ProfilePage(c *client) (err error) {
u, err := c.GetAccountCurrentUser(c.ctx)
if err != nil {
return
}
// Some instances allow more than 4 fields, but make sure that there are
// at least 4 fields in the slice because the template depends on it.
if u.Source.Fields == nil {
u.Source.Fields = new([]mastodon.Field)
}
for len(*u.Source.Fields) < 4 {
*u.Source.Fields = append(*u.Source.Fields, mastodon.Field{})
}
cdata := svc.cdata(c, "edit profile", 0, 0, "")
data := &renderer.ProfileData{
CommonData: cdata,
User: u,
}
return svc.renderer.Render(c.rctx, c.w, renderer.ProfilePage, data)
}
func (s *service) ProfileUpdate(c *client, name, bio string, avatar, banner *multipart.FileHeader,
fields []mastodon.Field, locked bool) (err error) {
// Need to pass empty data to clear fields
if len(fields) == 0 {
fields = append(fields, mastodon.Field{})
}
p := &mastodon.Profile{
DisplayName: &name,
Note: &bio,
Avatar: avatar,
Header: banner,
Fields: &fields,
Locked: &locked,
}
_, err = c.AccountUpdate(c.ctx, p)
return err
}
func (s *service) ProfileDelAvatar(c *client) (err error) {
_, err = c.AccountDeleteAvatar(c.ctx)
return
}
func (s *service) ProfileDelBanner(c *client) (err error) {
_, err = c.AccountDeleteHeader(c.ctx)
return err
}
func (s *service) SingleInstance() (instance string, ok bool) {
if len(s.instance) > 0 {
instance = s.instance

View file

@ -2,11 +2,14 @@ package service
import (
"encoding/json"
"fmt"
"log"
"mime/multipart"
"net/http"
"strconv"
"time"
"bloat/mastodon"
"bloat/model"
"github.com/gorilla/mux"
@ -202,6 +205,57 @@ func NewHandler(s *service, verbose bool, staticDir string) http.Handler {
return s.FiltersPage(c)
}, SESSION, HTML)
profilePage := handle(func(c *client) error {
return s.ProfilePage(c)
}, SESSION, HTML)
profileUpdate := handle(func(c *client) error {
name := c.r.FormValue("name")
bio := c.r.FormValue("bio")
var avatar, banner *multipart.FileHeader
if f := c.r.MultipartForm.File["avatar"]; len(f) > 0 {
avatar = f[0]
}
if f := c.r.MultipartForm.File["banner"]; len(f) > 0 {
banner = f[0]
}
var fields []mastodon.Field
for i := 0; i < 16; i++ {
n := c.r.FormValue(fmt.Sprintf("field-name-%d", i))
v := c.r.FormValue(fmt.Sprintf("field-value-%d", i))
if len(n) == 0 {
continue
}
f := mastodon.Field{Name: n, Value: v}
fields = append(fields, f)
}
locked := c.r.FormValue("locked") == "true"
err := s.ProfileUpdate(c, name, bio, avatar, banner, fields, locked)
if err != nil {
return err
}
c.redirect("/")
return nil
}, CSRF, HTML)
profileDelAvatar := handle(func(c *client) error {
err := s.ProfileDelAvatar(c)
if err != nil {
return err
}
c.redirect(c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
profileDelBanner := handle(func(c *client) error {
err := s.ProfileDelBanner(c)
if err != nil {
return err
}
c.redirect(c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
signin := handle(func(c *client) error {
instance := c.r.FormValue("instance")
url, sess, err := s.NewSession(c, instance)
@ -682,6 +736,10 @@ func NewHandler(s *service, verbose bool, staticDir string) http.Handler {
r.HandleFunc("/search", searchPage).Methods(http.MethodGet)
r.HandleFunc("/settings", settingsPage).Methods(http.MethodGet)
r.HandleFunc("/filters", filtersPage).Methods(http.MethodGet)
r.HandleFunc("/profile", profilePage).Methods(http.MethodGet)
r.HandleFunc("/profile", profileUpdate).Methods(http.MethodPost)
r.HandleFunc("/profile/delavatar", profileDelAvatar).Methods(http.MethodPost)
r.HandleFunc("/profile/delbanner", profileDelBanner).Methods(http.MethodPost)
r.HandleFunc("/signin", signin).Methods(http.MethodPost)
r.HandleFunc("/oauth_callback", oauthCallback).Methods(http.MethodGet)
r.HandleFunc("/post", post).Methods(http.MethodPost)