diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f8b3f1e83..50d8a6a1b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,6 +12,7 @@ "@mdi/font": "7.4.47", "axios": "^1.8.4", "cronstrue": "^2.57.0", + "date-fns": "^4.1.0", "js-cookie": "^3.0.5", "lodash": "^4.17.21", "md-editor-v3": "^5.5.0", @@ -4396,6 +4397,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 65de7081e..b2c3af0e7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,6 +30,7 @@ "@mdi/font": "7.4.47", "axios": "^1.8.4", "cronstrue": "^2.57.0", + "date-fns": "^4.1.0", "js-cookie": "^3.0.5", "lodash": "^4.17.21", "md-editor-v3": "^5.5.0", diff --git a/frontend/src/views/Player/EmulatorJS/Base.vue b/frontend/src/views/Player/EmulatorJS/Base.vue index 3693a1dcb..5f445b1f5 100644 --- a/frontend/src/views/Player/EmulatorJS/Base.vue +++ b/frontend/src/views/Player/EmulatorJS/Base.vue @@ -2,12 +2,13 @@ import EmptySaves from "@/components/common/EmptyStates/EmptySaves.vue"; import EmptyStates from "@/components/common/EmptyStates/EmptyStates.vue"; import type { FirmwareSchema, SaveSchema, StateSchema } from "@/__generated__"; +import { formatDistanceToNow } from "date-fns"; import RomListItem from "@/components/common/Game/ListItem.vue"; import firmwareApi from "@/services/api/firmware"; import romApi from "@/services/api/rom"; import storeAuth from "@/stores/auth"; import storeRoms, { type DetailedRom } from "@/stores/roms"; -import { formatBytes, formatTimestamp, getSupportedEJSCores } from "@/utils"; +import { formatTimestamp, getSupportedEJSCores } from "@/utils"; import { ROUTES } from "@/plugins/router"; import Player from "@/views/Player/EmulatorJS/Player.vue"; import { isNull } from "lodash"; @@ -154,6 +155,10 @@ function unselectState() { localStorage.removeItem(`player:${rom.value?.platform_slug}:state_id`); } +function formatRelativeDate(date: string | Date) { + return formatDistanceToNow(new Date(date), { addSuffix: true }); +} + onMounted(async () => { const romResponse = await romApi.getRom({ romId: parseInt(route.params.rom as string), @@ -297,7 +302,7 @@ onBeforeUnmount(async () => { @@ -305,8 +310,8 @@ onBeforeUnmount(async () => { @@ -324,7 +329,7 @@ onBeforeUnmount(async () => { class="bg-toplayer transform-scale" :class="{ 'disabled-card': openSaveSelector }" > - + { - {{ - selectedState.file_name - }} + {{ selectedState.file_name }} - - - {{ selectedState.emulator }} - - - - {{ formatBytes(selectedState.file_size_bytes) }} - - - - + Updated: {{ formatTimestamp(selectedState.updated_at) }} + ({{ + formatRelativeDate(selectedState.updated_at) + }}) + + + + + {{ selectedState.emulator }} - + mdi-close-circle-outline { class="bg-toplayer transform-scale" :class="{ 'disabled-card': openStateSelector }" > - + { - {{ - selectedSave.file_name - }} + {{ selectedSave.file_name }} - - - {{ selectedSave.emulator }} - - - - {{ formatBytes(selectedSave.file_size_bytes) }} - - - - + Updated: {{ formatTimestamp(selectedSave.updated_at) }} + ({{ + formatRelativeDate(selectedSave.updated_at) + }}) + + + + + {{ selectedSave.emulator }} - - + + mdi-close-circle-outline{{ t("play.deselect-save") }} @@ -464,7 +485,12 @@ onBeforeUnmount(async () => { sm="4" class="pa-1" v-if="rom.user_states.length > 0" - v-for="state in rom.user_states" + v-for="state in rom.user_states.sort((a, b) => { + return ( + new Date(b.updated_at).getTime() - + new Date(a.updated_at).getTime() + ); + })" > { - {{ - state.file_name - }} + {{ state.file_name }} - + + + Updated: {{ formatTimestamp(state.updated_at) }} + ({{ + formatRelativeDate(state.updated_at) + }}) + + + {{ state.emulator }} - - - {{ formatBytes(state.file_size_bytes) }} - - - - - Updated: {{ formatTimestamp(state.updated_at) }} - - @@ -531,7 +559,12 @@ onBeforeUnmount(async () => { sm="4" class="pa-1" v-if="rom.user_saves.length > 0" - v-for="save in rom.user_saves" + v-for="save in rom.user_saves.sort((a, b) => { + return ( + new Date(b.updated_at).getTime() - + new Date(a.updated_at).getTime() + ); + })" > { - {{ - save.file_name - }} + {{ save.file_name }} - + + + Updated: {{ formatTimestamp(save.updated_at) }} + ({{ formatRelativeDate(save.updated_at) }}) + + + {{ save.emulator }} - - - {{ formatBytes(save.file_size_bytes) }} - - - - - Updated: {{ formatTimestamp(save.updated_at) }} - -