diff --git a/src/client/components/PlayData.tsx b/src/client/components/PlayData.tsx index 118a13b1..2c443271 100644 --- a/src/client/components/PlayData.tsx +++ b/src/client/components/PlayData.tsx @@ -222,7 +222,7 @@ export const PlayDatesStack = (props: { play: JsonPlayObject, dates: DisplayDate } } if (dates.includes('seen') || dates.includes('all')) { - dateElements.push(({`Seen ${shortTodayAwareFormat(dayjs(play.data.playDate))}`})); + dateElements.push(({`Seen ${shortTodayAwareFormat(dayjs(play.meta.seenAt))}`})); } datesItem = ( @@ -255,8 +255,8 @@ export const PlayDatesFooter = (props: { play: JsonPlayObject, dates: DisplayDat playDate = {`Played ${shortTodayAwareFormat(dayjs(play.data.playDate))}`} } // TODO implement seenAt for play data - if (play.data.playDateCompleted !== undefined && ['all', 'seen'].includes(dates)) { - seenDate = {`Seen ${shortTodayAwareFormat(dayjs(play.data.playDateCompleted))}`} + if (play.meta.seenAt !== undefined && ['all', 'seen'].includes(dates)) { + seenDate = {`Seen ${shortTodayAwareFormat(dayjs(play.meta.seenAt))}`} } if (playDate !== undefined && seenDate !== undefined) { dateElm = {playDate}{seenDate} diff --git a/src/client/components/playActivity/PlayList.tsx b/src/client/components/playActivity/PlayList.tsx index 9b38b435..94549c4e 100644 --- a/src/client/components/playActivity/PlayList.tsx +++ b/src/client/components/playActivity/PlayList.tsx @@ -10,7 +10,7 @@ import doy from 'dayjs/plugin/dayOfYear.js'; import { VscDebugRestart } from "react-icons/vsc"; import { GroupedVirtuoso } from 'react-virtuoso' import { ActivityDetails } from '../ActivityDetail.js'; -import { sortByNewestPlayDate } from '../../../core/PlayUtils.js'; +import { sortByNewestPlayDate, sortByNewestSeenDate } from '../../../core/PlayUtils.js'; import "./PlayList.scss"; dayjs.extend(doy); @@ -73,10 +73,15 @@ export const PlayList = (props: ActivityLogProps) => { render = 'accordian' } = props; - const sorted = useMemo(() => props.data.toSorted((a, b) => sortByNewestPlayDate(a.play, b.play)), [data, sortBy]); + const sorted = useMemo(() => props.data.toSorted((a, b) => { + if(sortBy === 'played') { + return sortByNewestPlayDate(a.play, b.play) + } + return sortByNewestSeenDate(a.play, b.play); + }), [data, sortBy]); if (render === 'accordian') { - return + return } if (render === 'virtCollapse') { return @@ -285,8 +290,11 @@ const VirtualizedAccordian = (props: { data: PlayActivity[] }) => { ); } -const PlainAccordian = (props: { data: PlayActivity[] }) => { - const { data = [] } = props; +const PlainAccordian = (props: { data: PlayActivity[], sortBy: 'played' | 'seen' }) => { + const { + data = [], + sortBy + } = props; const groups = generateGroupPlays(data); return ( @@ -325,7 +333,7 @@ const PlainAccordian = (props: { data: PlayActivity[] }) => { {play.data.track} {play.data.artists.join(' / ')} - + {play.meta?.source} diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index 07c9391c..6e8b4bb0 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -198,6 +198,8 @@ export interface PlayMeta { source?: string sourceSOT?: SOURCE_SOT_TYPES + seenAt?: D + /* * If applicable, the name of the Service providing the track (Spotify, Tidal, etc...) */ @@ -345,7 +347,7 @@ export type DateLike = Dayjs | string export interface AmbPlayObject { data: PlayData, - meta: PlayMeta | MarkOptional, 'lifecycle'> + meta: PlayMeta | Omit, 'lifecycle'> } export const isPlayObject = (obj: object): obj is PlayObject => { diff --git a/src/core/PlayTestUtils.ts b/src/core/PlayTestUtils.ts index 96280c64..f8135d8c 100644 --- a/src/core/PlayTestUtils.ts +++ b/src/core/PlayTestUtils.ts @@ -181,6 +181,7 @@ export const generatePlay = (data: ObjectPlayData = {}, meta: MarkOptional, b: AmbPlayObject) => { - const { - data: { - playDate: aPlayDate - } = {} - } = a; - const { - data: { - playDate: bPlayDate - } = {} - } = b; +export const sortByNewestDate = (accessor: (play: AmbPlayObject) => DateLike) => (a: AmbPlayObject, b: AmbPlayObject) => { + const aPlayDate = accessor(a); + const bPlayDate = accessor(b); if (aPlayDate === undefined && bPlayDate === undefined) { return 0; } @@ -30,6 +21,13 @@ export const sortByNewestPlayDate = (a: AmbPlayObject, b: AmbPlayObjec return realA.isBefore(realB) ? 1 : -1; }; + +/** sorts playObj formatted objects by playDate in descending (newest first) order */ +export const sortByNewestPlayDate = sortByNewestDate((play) => play.data?.playDate); + +/** sorts playObj formatted objects by playDate in descending (newest first) order */ +export const sortByNewestSeenDate = sortByNewestDate((play) => play.meta?.seenAt); + export const genGroupIdStr = (id: PlayPlatformId) => { return `${id[0]}-${id[1]}`; };