this repo has no description
1package pages 2 3import ( 4 "embed" 5 "fmt" 6 "html/template" 7 "io" 8 "io/fs" 9 "log" 10 "path" 11 "strings" 12 13 "github.com/sotangled/tangled/appview/auth" 14 "github.com/sotangled/tangled/appview/db" 15 "github.com/sotangled/tangled/types" 16) 17 18//go:embed templates/* 19var files embed.FS 20 21type Pages struct { 22 t map[string]*template.Template 23} 24 25func funcMap() template.FuncMap { 26 return template.FuncMap{ 27 "split": func(s string) []string { 28 return strings.Split(s, "\n") 29 }, 30 "add": func(a, b int) int { 31 return a + b 32 }, 33 } 34} 35 36func NewPages() *Pages { 37 templates := make(map[string]*template.Template) 38 39 // Walk through embedded templates directory and parse all .html files 40 err := fs.WalkDir(files, "templates", func(path string, d fs.DirEntry, err error) error { 41 if err != nil { 42 return err 43 } 44 45 if !d.IsDir() && strings.HasSuffix(path, ".html") { 46 name := strings.TrimPrefix(path, "templates/") 47 name = strings.TrimSuffix(name, ".html") 48 49 if !strings.HasPrefix(path, "templates/layouts/") { 50 // Add the page template on top of the base 51 tmpl, err := template.New(name). 52 Funcs(funcMap()). 53 ParseFS(files, "templates/layouts/*.html", path) 54 if err != nil { 55 return fmt.Errorf("setting up template: %w", err) 56 } 57 58 templates[name] = tmpl 59 log.Printf("loaded template: %s", name) 60 } 61 62 return nil 63 } 64 return nil 65 }) 66 if err != nil { 67 log.Fatalf("walking template dir: %v", err) 68 } 69 70 log.Printf("total templates loaded: %d", len(templates)) 71 72 return &Pages{ 73 t: templates, 74 } 75} 76 77type LoginParams struct { 78} 79 80func (p *Pages) execute(name string, w io.Writer, params any) error { 81 return p.t[name].ExecuteTemplate(w, "layouts/base", params) 82} 83 84func (p *Pages) executePlain(name string, w io.Writer, params any) error { 85 return p.t[name].Execute(w, params) 86} 87 88func (p *Pages) executeRepo(name string, w io.Writer, params any) error { 89 return p.t[name].ExecuteTemplate(w, "layouts/repoBase", params) 90} 91 92func (p *Pages) Login(w io.Writer, params LoginParams) error { 93 return p.executePlain("user/login", w, params) 94} 95 96type TimelineParams struct { 97 LoggedInUser *auth.User 98} 99 100func (p *Pages) Timeline(w io.Writer, params TimelineParams) error { 101 return p.execute("timeline", w, params) 102} 103 104type SettingsParams struct { 105 LoggedInUser *auth.User 106 PubKeys []db.PublicKey 107} 108 109func (p *Pages) Settings(w io.Writer, params SettingsParams) error { 110 return p.execute("settings/keys", w, params) 111} 112 113type KnotsParams struct { 114 LoggedInUser *auth.User 115 Registrations []db.Registration 116} 117 118func (p *Pages) Knots(w io.Writer, params KnotsParams) error { 119 return p.execute("knots", w, params) 120} 121 122type KnotParams struct { 123 LoggedInUser *auth.User 124 Registration *db.Registration 125 Members []string 126 IsOwner bool 127} 128 129func (p *Pages) Knot(w io.Writer, params KnotParams) error { 130 return p.execute("knot", w, params) 131} 132 133type NewRepoParams struct { 134 LoggedInUser *auth.User 135} 136 137func (p *Pages) NewRepo(w io.Writer, params NewRepoParams) error { 138 return p.execute("repo/new", w, params) 139} 140 141type ProfilePageParams struct { 142 LoggedInUser *auth.User 143 UserDid string 144 UserHandle string 145 Repos []db.Repo 146} 147 148func (p *Pages) ProfilePage(w io.Writer, params ProfilePageParams) error { 149 return p.execute("user/profile", w, params) 150} 151 152type RepoInfo struct { 153 Name string 154 OwnerDid string 155 OwnerHandle string 156 Description string 157} 158 159func (r RepoInfo) OwnerWithAt() string { 160 if r.OwnerHandle != "" { 161 return fmt.Sprintf("@%s", r.OwnerHandle) 162 } else { 163 return r.OwnerDid 164 } 165} 166 167func (r RepoInfo) FullName() string { 168 return path.Join(r.OwnerWithAt(), r.Name) 169} 170 171type RepoIndexParams struct { 172 LoggedInUser *auth.User 173 RepoInfo RepoInfo 174 types.RepoIndexResponse 175} 176 177func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { 178 179 return p.executeRepo("repo/index", w, params) 180} 181 182type RepoLogParams struct { 183 LoggedInUser *auth.User 184 RepoInfo RepoInfo 185 types.RepoLogResponse 186} 187 188func (p *Pages) RepoLog(w io.Writer, params RepoLogParams) error { 189 return p.execute("repo/log", w, params) 190} 191 192type RepoCommitParams struct { 193 LoggedInUser *auth.User 194 RepoInfo RepoInfo 195 types.RepoCommitResponse 196} 197 198func (p *Pages) RepoCommit(w io.Writer, params RepoCommitParams) error { 199 return p.executeRepo("repo/commit", w, params) 200} 201 202type RepoTreeParams struct { 203 LoggedInUser *auth.User 204 RepoInfo RepoInfo 205 types.RepoTreeResponse 206} 207 208func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 209 return p.execute("repo/tree", w, params) 210} 211 212type RepoBranchesParams struct { 213 LoggedInUser *auth.User 214 RepoInfo RepoInfo 215 types.RepoBranchesResponse 216} 217 218func (p *Pages) RepoBranches(w io.Writer, params RepoBranchesParams) error { 219 return p.executeRepo("repo/branches", w, params) 220} 221 222type RepoTagsParams struct { 223 LoggedInUser *auth.User 224 RepoInfo RepoInfo 225 types.RepoTagsResponse 226} 227 228func (p *Pages) RepoTags(w io.Writer, params RepoTagsParams) error { 229 return p.executeRepo("repo/tags", w, params) 230} 231 232type RepoBlobParams struct { 233 LoggedInUser *auth.User 234 RepoInfo RepoInfo 235 types.RepoBlobResponse 236} 237 238func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { 239 return p.executeRepo("repo/blob", w, params) 240}