package pages import ( "embed" "fmt" "html/template" "io" "io/fs" "log" "strings" "github.com/sotangled/tangled/appview/auth" "github.com/sotangled/tangled/appview/db" "github.com/sotangled/tangled/types" ) //go:embed templates/* var files embed.FS type Pages struct { t map[string]*template.Template } func NewPages() *Pages { templates := make(map[string]*template.Template) // Walk through embedded templates directory and parse all .html files err := fs.WalkDir(files, "templates", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if !d.IsDir() && strings.HasSuffix(path, ".html") { name := strings.TrimPrefix(path, "templates/") name = strings.TrimSuffix(name, ".html") if !strings.HasPrefix(path, "templates/layouts/") { // Add the page template on top of the base tmpl, err := template.New(name).ParseFS(files, path, "templates/layouts/*.html") if err != nil { return fmt.Errorf("setting up template: %w", err) } templates[name] = tmpl log.Printf("loaded template: %s", name) } return nil } return nil }) if err != nil { log.Fatalf("walking template dir: %v", err) } log.Printf("total templates loaded: %d", len(templates)) return &Pages{ t: templates, } } type LoginParams struct { } func (p *Pages) execute(name string, w io.Writer, params any) error { return p.t[name].ExecuteTemplate(w, "layouts/base", params) } func (p *Pages) Login(w io.Writer, params LoginParams) error { return p.t["user/login"].ExecuteTemplate(w, "layouts/base", params) } type TimelineParams struct { User *auth.User } func (p *Pages) Timeline(w io.Writer, params TimelineParams) error { return p.execute("timeline", w, params) } type SettingsParams struct { User *auth.User PubKeys []db.PublicKey } func (p *Pages) Settings(w io.Writer, params SettingsParams) error { return p.execute("settings/keys", w, params) } type KnotsParams struct { User *auth.User Registrations []db.Registration } func (p *Pages) Knots(w io.Writer, params KnotsParams) error { return p.execute("knots", w, params) } type KnotParams struct { User *auth.User Registration *db.Registration Members []string IsOwner bool } func (p *Pages) Knot(w io.Writer, params KnotParams) error { return p.execute("knot", w, params) } type NewRepoParams struct { User *auth.User } func (p *Pages) NewRepo(w io.Writer, params NewRepoParams) error { return p.execute("repo/new", w, params) } type ProfilePageParams struct { LoggedInUser *auth.User UserDid string UserHandle string Repos []db.Repo } func (p *Pages) ProfilePage(w io.Writer, params ProfilePageParams) error { return p.execute("user/profile", w, params) } type RepoIndexParams struct { LoggedInUser *auth.User Name string UserDid string UserHandle string types.RepoIndexResponse } func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { return p.execute("repo/index", w, params) }