feat(web): align the web UI with the design prototype
ci / api / api (push) Successful in 43s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 52s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m36s
ci / ts / ts (packages + web) (push) Successful in 1m39s

- Ambient background in the app shell: three drifting blurred blobs,
  the third one tinted with the current track's cover; can be turned off
  in settings and stays still with reduced motion.
- Island player variant (floating glass panel) next to the bar, chosen
  in settings; player source line ("Album · …", "My Wave"), reactions
  around the transport controls, queue drawer.
- Sidebar: like / dislike counters, pending uploads badge on Queue,
  admin Settings page holding the upload queue limits.
- Collection: header tile with kicker, underline tabs, time / number
  lead column with an equalizer for the current track, album column,
  dimmed dislikes with undo, Play all / Shuffle pills.
- Album: cover-tinted header and Play / Shuffle; artist: artist wave,
  Play and popular tracks (new GET /artists/{id}/top-tracks).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-20 18:13:24 +03:00
1 parent 3afed02f23
commit 1c4e209e86
29 files changed
+1381 -339

No files matched your search

+354 -233
View File
@@ -1266,6 +1266,11 @@ type ListUsersParams struct {
Cursor *Cursor `form:"cursor,omitempty" json:"cursor,omitempty"`
}
// ListArtistTopTracksParams defines parameters for ListArtistTopTracks.
type ListArtistTopTracksParams struct {
Limit *int `form:"limit,omitempty" json:"limit,omitempty"`
}
// RefreshTokensParams defines parameters for RefreshTokens.
type RefreshTokensParams struct {
PipuRt *string `form:"pipu_rt,omitempty" json:"pipu_rt,omitempty"`
@@ -1517,6 +1522,9 @@ type ServerInterface interface {
// Альбомы исполнителя (свои и сборники с его треками)
// (GET /api/v1/artists/{id}/albums)
ListArtistAlbums(w http.ResponseWriter, r *http.Request, id EntityId)
// Популярные треки исполнителя (по прослушиваниям всех пользователей)
// (GET /api/v1/artists/{id}/top-tracks)
ListArtistTopTracks(w http.ResponseWriter, r *http.Request, id EntityId, params ListArtistTopTracksParams)
// Вход по логину и паролю
// (POST /api/v1/auth/login)
Login(w http.ResponseWriter, r *http.Request)
@@ -1835,6 +1843,12 @@ func (_ Unimplemented) ListArtistAlbums(w http.ResponseWriter, r *http.Request,
w.WriteHeader(http.StatusNotImplemented)
}
// Популярные треки исполнителя (по прослушиваниям всех пользователей)
// (GET /api/v1/artists/{id}/top-tracks)
func (_ Unimplemented) ListArtistTopTracks(w http.ResponseWriter, r *http.Request, id EntityId, params ListArtistTopTracksParams) {
w.WriteHeader(http.StatusNotImplemented)
}
// Вход по логину и паролю
// (POST /api/v1/auth/login)
func (_ Unimplemented) Login(w http.ResponseWriter, r *http.Request) {
@@ -3086,6 +3100,48 @@ func (siw *ServerInterfaceWrapper) ListArtistAlbums(w http.ResponseWriter, r *ht
handler.ServeHTTP(w, r)
}
// ListArtistTopTracks operation middleware
func (siw *ServerInterfaceWrapper) ListArtistTopTracks(w http.ResponseWriter, r *http.Request) {
var err error
// ------------- Path parameter "id" -------------
var id EntityId
err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err})
return
}
ctx := r.Context()
ctx = context.WithValue(ctx, BearerAuthScopes, []string{})
r = r.WithContext(ctx)
// Parameter object where we will unmarshal all parameters from the context
var params ListArtistTopTracksParams
// ------------- Optional query parameter "limit" -------------
err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), &params.Limit)
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err})
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.ListArtistTopTracks(w, r, id, params)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// Login operation middleware
func (siw *ServerInterfaceWrapper) Login(w http.ResponseWriter, r *http.Request) {
@@ -4399,6 +4455,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl
r.Group(func(r chi.Router) {
r.Get(options.BaseURL+"/api/v1/artists/{id}/albums", wrapper.ListArtistAlbums)
})
r.Group(func(r chi.Router) {
r.Get(options.BaseURL+"/api/v1/artists/{id}/top-tracks", wrapper.ListArtistTopTracks)
})
r.Group(func(r chi.Router) {
r.Post(options.BaseURL+"/api/v1/auth/login", wrapper.Login)
})
@@ -5485,6 +5544,36 @@ func (response ListArtistAlbumsdefaultApplicationProblemPlusJSONResponse) VisitL
return json.NewEncoder(w).Encode(response.Body)
}
type ListArtistTopTracksRequestObject struct {
Id EntityId `json:"id"`
Params ListArtistTopTracksParams
}
type ListArtistTopTracksResponseObject interface {
VisitListArtistTopTracksResponse(w http.ResponseWriter) error
}
type ListArtistTopTracks200JSONResponse TrackList
func (response ListArtistTopTracks200JSONResponse) VisitListArtistTopTracksResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
return json.NewEncoder(w).Encode(response)
}
type ListArtistTopTracksdefaultApplicationProblemPlusJSONResponse struct {
Body Problem
StatusCode int
}
func (response ListArtistTopTracksdefaultApplicationProblemPlusJSONResponse) VisitListArtistTopTracksResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/problem+json")
w.WriteHeader(response.StatusCode)
return json.NewEncoder(w).Encode(response.Body)
}
type LoginRequestObject struct {
Body *LoginJSONRequestBody
}
@@ -6681,6 +6770,9 @@ type StrictServerInterface interface {
// Альбомы исполнителя (свои и сборники с его треками)
// (GET /api/v1/artists/{id}/albums)
ListArtistAlbums(ctx context.Context, request ListArtistAlbumsRequestObject) (ListArtistAlbumsResponseObject, error)
// Популярные треки исполнителя (по прослушиваниям всех пользователей)
// (GET /api/v1/artists/{id}/top-tracks)
ListArtistTopTracks(ctx context.Context, request ListArtistTopTracksRequestObject) (ListArtistTopTracksResponseObject, error)
// Вход по логину и паролю
// (POST /api/v1/auth/login)
Login(ctx context.Context, request LoginRequestObject) (LoginResponseObject, error)
@@ -7743,6 +7835,33 @@ func (sh *strictHandler) ListArtistAlbums(w http.ResponseWriter, r *http.Request
}
}
// ListArtistTopTracks operation middleware
func (sh *strictHandler) ListArtistTopTracks(w http.ResponseWriter, r *http.Request, id EntityId, params ListArtistTopTracksParams) {
var request ListArtistTopTracksRequestObject
request.Id = id
request.Params = params
handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
return sh.ssi.ListArtistTopTracks(ctx, request.(ListArtistTopTracksRequestObject))
}
for _, middleware := range sh.middlewares {
handler = middleware(handler, "ListArtistTopTracks")
}
response, err := handler(r.Context(), w, r, request)
if err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
} else if validResponse, ok := response.(ListArtistTopTracksResponseObject); ok {
if err := validResponse.VisitListArtistTopTracksResponse(w); err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
}
} else if response != nil {
sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response))
}
}
// Login operation middleware
func (sh *strictHandler) Login(w http.ResponseWriter, r *http.Request) {
var request LoginRequestObject
@@ -8792,239 +8911,241 @@ func (sh *strictHandler) GetReadyz(w http.ResponseWriter, r *http.Request) {
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"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",
"YSFPodutPb77+P8FAAD//9wKjL6lLQEA",
}
// GetSwagger returns the content of the embedded swagger specification file
+9
View File
@@ -132,6 +132,15 @@ func (st *Store) TracksByIDs(ctx context.Context, ids []uuid.UUID) ([]TrackRow,
return out, nil
}
// ArtistTopTracks — треки исполнителя (основной или приглашённый), самые слушаемые всеми пользователями первыми.
func (st *Store) ArtistTopTracks(ctx context.Context, artistID uuid.UUID, limit int) ([]TrackRow, error) {
return st.queryTracks(ctx, `
WHERE t.id IN (SELECT track_id FROM track_artists WHERE artist_id = $1)
ORDER BY COALESCE((SELECT sum(s.play_count) FROM user_track_stats s WHERE s.track_id = t.id), 0) DESC,
t.created_at DESC
LIMIT $2`, artistID, limit)
}
// AlbumTracks — треки альбома по дискам и номерам.
func (st *Store) AlbumTracks(ctx context.Context, albumID uuid.UUID) ([]TrackRow, error) {
return st.queryTracks(ctx, "WHERE t.album_id = $1 ORDER BY t.disc_no NULLS FIRST, t.track_no NULLS LAST, t.title", albumID)
+20
View File
@@ -469,6 +469,26 @@ func (h *Handler) GetAlbum(ctx context.Context, req gen.GetAlbumRequestObject) (
return out, nil
}
// ListArtistTopTracks реализует gen.StrictServerInterface.
func (h *Handler) ListArtistTopTracks(ctx context.Context, req gen.ListArtistTopTracksRequestObject) (gen.ListArtistTopTracksResponseObject, error) {
if _, err := h.store.Artist(ctx, req.Id); err != nil {
return nil, catalogErr(err)
}
limit := 10
if req.Params.Limit != nil {
limit = min(max(*req.Params.Limit, 1), 50)
}
rows, err := h.store.ArtistTopTracks(ctx, req.Id, limit)
if err != nil {
return nil, err
}
items, err := h.Tracks(ctx, rows)
if err != nil {
return nil, err
}
return gen.ListArtistTopTracks200JSONResponse{Items: items}, nil
}
// GetTrack реализует gen.StrictServerInterface.
func (h *Handler) GetTrack(ctx context.Context, req gen.GetTrackRequestObject) (gen.GetTrackResponseObject, error) {
t, err := h.store.Track(ctx, req.Id)