view: updated home page to include recently added images
This commit is contained in:
parent
62e3f9778e
commit
f8921b0cc9
|
@ -196,7 +196,7 @@ func (api *API) downloadSubredditImage(ctx context.Context, post reddit.Post, su
|
||||||
DeviceID: omit.From(device.ID),
|
DeviceID: omit.From(device.ID),
|
||||||
Title: omit.From(post.GetTitle()),
|
Title: omit.From(post.GetTitle()),
|
||||||
PostID: omit.From(post.GetID()),
|
PostID: omit.From(post.GetID()),
|
||||||
PostURL: omit.From(post.GetImageURL()),
|
PostURL: omit.From(post.GetPostURL()),
|
||||||
PostCreated: omit.From(post.GetCreated().Format(time.RFC3339)),
|
PostCreated: omit.From(post.GetCreated().Format(time.RFC3339)),
|
||||||
PostName: omit.From(post.GetName()),
|
PostName: omit.From(post.GetName()),
|
||||||
Poster: omit.From(post.GetAuthor()),
|
Poster: omit.From(post.GetAuthor()),
|
||||||
|
@ -373,7 +373,7 @@ func (api *API) copyImageToTempDir(ctx context.Context, img reddit.PostImage) (t
|
||||||
split := strings.Split(url.Path, "/")
|
split := strings.Split(url.Path, "/")
|
||||||
imageFilename := split[len(split)-1]
|
imageFilename := split[len(split)-1]
|
||||||
tmpDirname := path.Join(os.TempDir(), "redmage")
|
tmpDirname := path.Join(os.TempDir(), "redmage")
|
||||||
err = os.MkdirAll(tmpDirname, 0777)
|
err = os.MkdirAll(tmpDirname, 0o777)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errs.Wrapw(err, "failed to create temporary dir", "dir_name", tmpDirname)
|
return nil, errs.Wrapw(err, "failed to create temporary dir", "dir_name", tmpDirname)
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,7 +354,7 @@ func (post *Post) GetPermalink() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *Post) GetPostURL() string {
|
func (post *Post) GetPostURL() string {
|
||||||
return fmt.Sprintf("https://reddit.com/%s", post.Data.Permalink)
|
return fmt.Sprintf("https://reddit.com%s", post.Data.Permalink)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (post *Post) GetID() string {
|
func (post *Post) GetID() string {
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
POST http://localhost:8080/api/v1/subreddits HTTP/1.1
|
POST http://localhost:8080/api/v1/subreddits HTTP/1.1
|
||||||
Host: localhost:8080
|
Host: localhost:8080
|
||||||
Content-Length: 109
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "animemidriff",
|
"name": "CultureImpact",
|
||||||
"enable_schedule": 1,
|
"enable_schedule": 1,
|
||||||
"schedule": "@daily",
|
"schedule": "@daily",
|
||||||
"countback": 300
|
"countback": 300
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
POST http://localhost:8080/api/v1/subreddits/start HTTP/1.1
|
POST http://localhost:8080/api/v1/subreddits/start HTTP/1.1
|
||||||
Host: localhost:8080
|
Host: localhost:8080
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Content-Length: 35
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"subreddit": "fantasymoe"
|
"subreddit": "CultureImpact"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
package routes
|
package routes
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/tigorlazuardi/redmage/api"
|
||||||
|
"github.com/tigorlazuardi/redmage/pkg/errs"
|
||||||
"github.com/tigorlazuardi/redmage/pkg/log"
|
"github.com/tigorlazuardi/redmage/pkg/log"
|
||||||
"github.com/tigorlazuardi/redmage/views"
|
"github.com/tigorlazuardi/redmage/views"
|
||||||
"github.com/tigorlazuardi/redmage/views/homeview"
|
"github.com/tigorlazuardi/redmage/views/homeview"
|
||||||
|
@ -14,16 +18,34 @@ func (routes *Routes) PageHome(rw http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
vc := views.NewContext(routes.Config, r)
|
vc := views.NewContext(routes.Config, r)
|
||||||
|
|
||||||
params := parseSubredditListQuery(r)
|
listSubredditParams := parseSubredditListQuery(r)
|
||||||
|
|
||||||
list, err := routes.API.ListSubreddits(ctx, params)
|
list, err := routes.API.ListSubreddits(ctx, listSubredditParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rw.WriteHeader(http.StatusInternalServerError)
|
log.New(ctx).Err(err).Error("failed to list subreddits")
|
||||||
|
code, message := errs.HTTPMessage(err)
|
||||||
|
rw.WriteHeader(code)
|
||||||
|
_ = json.NewEncoder(rw).Encode(map[string]string{"error": message})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
imageListParams := api.ImageListParams{}
|
||||||
|
imageListParams.FillFromQuery(r.URL.Query())
|
||||||
|
imageListParams.CreatedAt = time.Now().Add(-time.Hour * 24 * 3) // images in the last 3 days.
|
||||||
|
|
||||||
|
imageList, err := routes.API.ImagesListWithDevicesAndSubreddits(ctx, imageListParams)
|
||||||
|
if err != nil {
|
||||||
|
log.New(ctx).Err(err).Error("failed to list subreddits")
|
||||||
|
code, message := errs.HTTPMessage(err)
|
||||||
|
rw.WriteHeader(code)
|
||||||
|
_ = json.NewEncoder(rw).Encode(map[string]string{"error": message})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
data := homeview.Data{
|
data := homeview.Data{
|
||||||
SubredditsList: list,
|
SubredditsList: list,
|
||||||
Error: err,
|
RecentlyAddedImages: imageList,
|
||||||
|
Error: err,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := homeview.Home(vc, data).Render(ctx, rw); err != nil {
|
if err := homeview.Home(vc, data).Render(ctx, rw); err != nil {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package components
|
||||||
import "github.com/tigorlazuardi/redmage/views"
|
import "github.com/tigorlazuardi/redmage/views"
|
||||||
|
|
||||||
templ Body(c *views.Context) {
|
templ Body(c *views.Context) {
|
||||||
<body class="bg-base-100 min-h-screen" hx-ext="response-targets">
|
<body class="bg-base-100 min-h-screen w-screen" hx-ext="response-targets">
|
||||||
@Navigation(c) {
|
@Navigation(c) {
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
@Navbar(c)
|
@Navbar(c)
|
||||||
|
|
|
@ -5,8 +5,9 @@ import "github.com/tigorlazuardi/redmage/views"
|
||||||
import "github.com/tigorlazuardi/redmage/api"
|
import "github.com/tigorlazuardi/redmage/api"
|
||||||
|
|
||||||
type Data struct {
|
type Data struct {
|
||||||
SubredditsList api.ListSubredditsResult
|
SubredditsList api.ListSubredditsResult
|
||||||
Error error
|
RecentlyAddedImages api.ImageListResult
|
||||||
|
Error error
|
||||||
}
|
}
|
||||||
|
|
||||||
templ Home(c *views.Context, data Data) {
|
templ Home(c *views.Context, data Data) {
|
||||||
|
@ -24,10 +25,15 @@ templ Home(c *views.Context, data Data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
templ home(c *views.Context, data Data) {
|
templ home(_ *views.Context, data Data) {
|
||||||
<div class="prose">
|
<div class="prose">
|
||||||
<section>
|
<section class="mb-4 mx-auto">
|
||||||
<h1>Recently Added</h1>
|
<h1>Recently Added</h1>
|
||||||
|
<div class="flex gap-4 flex-wrap pb-4 pr-8 w-[100vw] lg:w-[80vw] justify-around">
|
||||||
|
for _, image := range data.RecentlyAddedImages.Images {
|
||||||
|
@RecentlyAddedImageCard(image, 0)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<h1>Subreddits</h1>
|
<h1>Subreddits</h1>
|
||||||
|
|
51
views/homeview/recently_added_image_card.templ
Normal file
51
views/homeview/recently_added_image_card.templ
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package homeview
|
||||||
|
|
||||||
|
import "github.com/tigorlazuardi/redmage/models"
|
||||||
|
import "github.com/tigorlazuardi/redmage/api/reddit"
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type ImageCardOption uint
|
||||||
|
|
||||||
|
func (o ImageCardOption) Has(opt ImageCardOption) bool {
|
||||||
|
return o&opt != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
HideTitle ImageCardOption = 1 << iota
|
||||||
|
HideDescription
|
||||||
|
HideSubreddit
|
||||||
|
HidePoster
|
||||||
|
)
|
||||||
|
|
||||||
|
templ RecentlyAddedImageCard(data *models.Image, opts ImageCardOption) {
|
||||||
|
<div class="not-prose card bg-base-100 shadow-xl w-[250px]">
|
||||||
|
<figure>
|
||||||
|
<a
|
||||||
|
href={ templ.URL(fmt.Sprintf("/img/%s", data.ImageRelativePath)) }
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
class="object-contain w-[250px] h-[250px]"
|
||||||
|
src={ fmt.Sprintf("/img/%s", data.ThumbnailRelativePath) }
|
||||||
|
alt={ data.Title }
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</figure>
|
||||||
|
<div class="card-body">
|
||||||
|
if !opts.Has(HideTitle) {
|
||||||
|
<a
|
||||||
|
href={ templ.URL(data.PostURL) }
|
||||||
|
class="card-title font-normal underline text-base text-primary-content"
|
||||||
|
>{ data.Title }</a>
|
||||||
|
}
|
||||||
|
<a class="text-primary-content underline" href={ templ.URL(data.PosterURL) }>{ data.Poster }</a>
|
||||||
|
if data.R.Subreddit != nil {
|
||||||
|
if !opts.Has(HideSubreddit) {
|
||||||
|
<a
|
||||||
|
class="text-primary-content underline text-base"
|
||||||
|
href={ templ.URL(fmt.Sprintf("https://reddit.com/%s/%s", reddit.SubredditType(data.R.Subreddit.Subtype), data.R.Subreddit.Name)) }
|
||||||
|
>{ data.R.Subreddit.Name } </a>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
Loading…
Reference in a new issue