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 Knots []string 136} 137 138func (p *Pages) NewRepo(w io.Writer, params NewRepoParams) error { 139 return p.execute("repo/new", w, params) 140} 141 142type ProfilePageParams struct { 143 LoggedInUser *auth.User 144 UserDid string 145 UserHandle string 146 Repos []db.Repo 147} 148 149func (p *Pages) ProfilePage(w io.Writer, params ProfilePageParams) error { 150 return p.execute("user/profile", w, params) 151} 152 153type RepoInfo struct { 154 Name string 155 OwnerDid string 156 OwnerHandle string 157 Description string 158} 159 160func (r RepoInfo) OwnerWithAt() string { 161 if r.OwnerHandle != "" { 162 return fmt.Sprintf("@%s", r.OwnerHandle) 163 } else { 164 return r.OwnerDid 165 } 166} 167 168func (r RepoInfo) FullName() string { 169 return path.Join(r.OwnerWithAt(), r.Name) 170} 171 172type RepoIndexParams struct { 173 LoggedInUser *auth.User 174 RepoInfo RepoInfo 175 types.RepoIndexResponse 176} 177 178func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { 179 180 return p.executeRepo("repo/index", w, params) 181} 182 183type RepoLogParams struct { 184 LoggedInUser *auth.User 185 RepoInfo RepoInfo 186 types.RepoLogResponse 187} 188 189func (p *Pages) RepoLog(w io.Writer, params RepoLogParams) error { 190 return p.execute("repo/log", w, params) 191} 192 193type RepoCommitParams struct { 194 LoggedInUser *auth.User 195 RepoInfo RepoInfo 196 types.RepoCommitResponse 197} 198 199func (p *Pages) RepoCommit(w io.Writer, params RepoCommitParams) error { 200 return p.executeRepo("repo/commit", w, params) 201} 202 203type RepoTreeParams struct { 204 LoggedInUser *auth.User 205 RepoInfo RepoInfo 206 types.RepoTreeResponse 207} 208 209func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 210 return p.execute("repo/tree", w, params) 211} 212 213type RepoBranchesParams struct { 214 LoggedInUser *auth.User 215 RepoInfo RepoInfo 216 types.RepoBranchesResponse 217} 218 219func (p *Pages) RepoBranches(w io.Writer, params RepoBranchesParams) error { 220 return p.executeRepo("repo/branches", w, params) 221} 222 223type RepoTagsParams struct { 224 LoggedInUser *auth.User 225 RepoInfo RepoInfo 226 types.RepoTagsResponse 227} 228 229func (p *Pages) RepoTags(w io.Writer, params RepoTagsParams) error { 230 return p.executeRepo("repo/tags", w, params) 231} 232 233type RepoBlobParams struct { 234 LoggedInUser *auth.User 235 RepoInfo RepoInfo 236 types.RepoBlobResponse 237} 238 239func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { 240 return p.executeRepo("repo/blob", w, params) 241}