fix: ui fixes and koito import time config fix (#128)

* fix: add import time checking to koito import

* adjust interest graph css

* show musicbrainz link when not logged in

* remove chart animation

* change interest steps to 16
This commit is contained in:
Gabe Farrell 2026-01-12 17:44:33 -05:00 committed by GitHub
parent 231eb1b0fb
commit ddb0becc0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 104 additions and 103 deletions

View file

@ -1,17 +1,8 @@
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { import { getInterest, type getInterestArgs } from "api/api";
getActivity,
getInterest,
type getActivityArgs,
type getInterestArgs,
type ListenActivityItem,
} from "api/api";
import Popup from "./Popup";
import { useState } from "react";
import { useTheme } from "~/hooks/useTheme"; import { useTheme } from "~/hooks/useTheme";
import ActivityOptsSelector from "./ActivityOptsSelector";
import type { Theme } from "~/styles/themes.css"; import type { Theme } from "~/styles/themes.css";
import { Area, AreaChart, Line, LineChart, Tooltip } from "recharts"; import { Area, AreaChart } from "recharts";
import { RechartsDevtools } from "@recharts/devtools"; import { RechartsDevtools } from "@recharts/devtools";
function getPrimaryColor(theme: Theme): string { function getPrimaryColor(theme: Theme): string {
@ -34,7 +25,7 @@ interface Props {
} }
export default function InterestGraph({ export default function InterestGraph({
buckets = 14, buckets = 16,
artistId = 0, artistId = 0,
albumId = 0, albumId = 0,
trackId = 0, trackId = 0,
@ -71,6 +62,10 @@ export default function InterestGraph({
); );
} }
// Note: I would really like to have the animation for the graph, however
// the line graph can get weirdly clipped before the animation is done
// so I think I just have to remove it for now.
return ( return (
<div className="flex flex-col items-start w-full max-w-[500px]"> <div className="flex flex-col items-start w-full max-w-[500px]">
<h3>Interest over time</h3> <h3>Interest over time</h3>
@ -81,13 +76,13 @@ export default function InterestGraph({
maxWidth: 440, maxWidth: 440,
overflow: "visible", overflow: "visible",
}} }}
margin={{ top: 5, right: 0, left: 0, bottom: 10 }}
data={data} data={data}
margin={{ top: 15, bottom: 20 }}
> >
<defs> <defs>
<linearGradient id="colorGradient" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="colorGradient" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor={color} stopOpacity={0.5} /> <stop offset="5%" stopColor={color} stopOpacity={0.5} />
<stop offset="85%" stopColor={color} stopOpacity={0} /> <stop offset="95%" stopColor={color} stopOpacity={0} />
</linearGradient> </linearGradient>
</defs> </defs>
<Area <Area
@ -95,7 +90,7 @@ export default function InterestGraph({
type="natural" type="natural"
stroke="none" stroke="none"
fill="url(#colorGradient)" fill="url(#colorGradient)"
animationDuration={750} animationDuration={0}
animationEasing="ease-in-out" animationEasing="ease-in-out"
activeDot={false} activeDot={false}
/> />
@ -105,11 +100,11 @@ export default function InterestGraph({
stroke={color} stroke={color}
fill="none" fill="none"
strokeWidth={2} strokeWidth={2}
animationDuration={750} animationDuration={0}
animationEasing="ease-in-out" animationEasing="ease-in-out"
dot={false} dot={false}
activeDot={false} activeDot={false}
style={{ filter: `drop-shadow(0px 0px 5px ${color})` }} style={{ filter: `drop-shadow(0px 0px 0px ${color})` }}
/> />
</AreaChart> </AreaChart>
</div> </div>

View file

@ -99,7 +99,6 @@ export default function MediaLayout(props: Props) {
<h1>{props.title}</h1> <h1>{props.title}</h1>
{props.subContent} {props.subContent}
</div> </div>
{user && (
<div className="absolute left-1 sm:right-1 sm:left-auto -top-9 sm:top-1 flex gap-3 items-center"> <div className="absolute left-1 sm:right-1 sm:left-auto -top-9 sm:top-1 flex gap-3 items-center">
{props.musicbrainzId && ( {props.musicbrainzId && (
<Link <Link
@ -112,6 +111,8 @@ export default function MediaLayout(props: Props) {
<MbzIcon size={iconSize} hover /> <MbzIcon size={iconSize} hover />
</Link> </Link>
)} )}
{user && (
<>
{props.type === "Track" && ( {props.type === "Track" && (
<> <>
<button <button
@ -188,9 +189,10 @@ export default function MediaLayout(props: Props) {
id={props.id} id={props.id}
type={props.type} type={props.type}
/> />
</div> </>
)} )}
</div> </div>
</div>
{props.children} {props.children}
</div> </div>
</main> </main>

View file

@ -42,6 +42,10 @@ func ImportKoitoFile(ctx context.Context, store db.DB, filename string) error {
count := 0 count := 0
for i := range data.Listens { for i := range data.Listens {
if !inImportTimeWindow(data.Listens[i].ListenedAt) {
l.Debug().Msgf("Skipping import due to import time rules")
continue
}
// use this for save/get mbid for all artist/album/track // use this for save/get mbid for all artist/album/track
var mbid uuid.UUID var mbid uuid.UUID