From 123ac57643ffa95745d7b757a64761ca6c989663 Mon Sep 17 00:00:00 2001 From: Sakura Knoll Date: Mon, 27 Dec 2021 23:26:24 +0900 Subject: [PATCH] Replace version page with supply event page --- public/data/versions/5.3/description.md | 1 + ....12.02-da-battlesuit-expansion-supply.json | 0 ...miracle-kissy-pillow-equipment-supply.json | 0 .../v5.3-21.12.02-sns-battlesuit-supply.json | 0 .../v5.3-21.12.02-tz-elf-supply.json | 0 ...arlance-prime-focused-supply-a copy 2.json | 0 ...-hekate-s-gloom-focused-supply-a copy.json | 0 ...-mitternachts-waltz-schicksal-arsenal.json | 0 ....12.10-nuada-s-grief-focused-supply-a.json | 0 .../v5.3-21.12.10-pv-battlesuit-supply.json | 0 ...ar-shatterer-vikrant-focused-supply-b.json | 0 ...12.17-hos-battlesuit-expansion-supply.json | 0 ...2.17-key-of-oblivion-focused-supply-a.json | 0 ....20-nebulous-duality-focused-supply-b.json | 0 ...3-21.12.24-expa-select-supply-round-1.json | 0 ...3-21.12.24-foca-select-supply-round-1.json | 0 .../v5.3-21.12.24-sa-battlesuit-supply.json | 0 .../v5.3-21.12.24-sr-elf-supply.json | 0 .../v5.3-21.12.27-bl-elf-supply.json | 0 ...3-21.12.27-expa-select-supply-round-2.json | 0 ...3-21.12.27-foca-select-supply-round-2.json | 0 ...3-21.12.29-expa-select-supply-round-3.json | 0 ...3-21.12.29-foca-select-supply-round-3.json | 0 .../v5.3-21.12.29-tz-elf-supply.json | 0 .../v5.3-21.12.31-se-elf-supply.json | 0 .../v5.3-22.01.03-we-elf-supply.json | 0 .../v5.3-22.01.05-bof-elf-supply.json | 0 public/data/versions/5.3/version-data.json | 8 + public/data/versions/5.4/description.md | 0 public/data/versions/5.4/version-data.json | 8 + src/components/organisms/GanttChart.tsx | 176 ++++++++ .../organisms/Honkai3rdNavigator.tsx | 5 + src/data/honkai3rd/supply-events.ts | 54 +-- src/data/honkai3rd/versions.ts | 52 +++ src/lib/string.ts | 22 + src/pages/honkai3rd/supply-events/index.tsx | 420 ------------------ src/pages/honkai3rd/versions/[versionId].tsx | 47 ++ src/pages/honkai3rd/versions/index.tsx | 218 +++++++++ 38 files changed, 551 insertions(+), 460 deletions(-) create mode 100644 public/data/versions/5.3/description.md rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.02-da-battlesuit-expansion-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.02-miracle-kissy-pillow-equipment-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.02-sns-battlesuit-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.02-tz-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.03-starlance-prime-focused-supply-a copy 2.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.06-hekate-s-gloom-focused-supply-a copy.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.10-mitternachts-waltz-schicksal-arsenal.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.10-nuada-s-grief-focused-supply-a.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.10-pv-battlesuit-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.13-star-shatterer-vikrant-focused-supply-b.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.17-hos-battlesuit-expansion-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.17-key-of-oblivion-focused-supply-a.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.20-nebulous-duality-focused-supply-b.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.24-expa-select-supply-round-1.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.24-foca-select-supply-round-1.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.24-sa-battlesuit-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.24-sr-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.27-bl-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.27-expa-select-supply-round-2.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.27-foca-select-supply-round-2.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.29-expa-select-supply-round-3.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.29-foca-select-supply-round-3.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.29-tz-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-21.12.31-se-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-22.01.03-we-elf-supply.json (100%) rename public/data/{supply-events/global-americas => versions/5.3/supply-events}/v5.3-22.01.05-bof-elf-supply.json (100%) create mode 100644 public/data/versions/5.3/version-data.json create mode 100644 public/data/versions/5.4/description.md create mode 100644 public/data/versions/5.4/version-data.json create mode 100644 src/components/organisms/GanttChart.tsx create mode 100644 src/data/honkai3rd/versions.ts create mode 100644 src/lib/string.ts delete mode 100644 src/pages/honkai3rd/supply-events/index.tsx create mode 100644 src/pages/honkai3rd/versions/[versionId].tsx create mode 100644 src/pages/honkai3rd/versions/index.tsx diff --git a/public/data/versions/5.3/description.md b/public/data/versions/5.3/description.md new file mode 100644 index 00000000..4bb266a3 --- /dev/null +++ b/public/data/versions/5.3/description.md @@ -0,0 +1 @@ +https://honkaiimpact3.mihoyo.com/global/en-us/news/17390 diff --git a/public/data/supply-events/global-americas/v5.3-21.12.02-da-battlesuit-expansion-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.02-da-battlesuit-expansion-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.02-da-battlesuit-expansion-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.02-da-battlesuit-expansion-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.02-miracle-kissy-pillow-equipment-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.02-miracle-kissy-pillow-equipment-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.02-miracle-kissy-pillow-equipment-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.02-miracle-kissy-pillow-equipment-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.02-sns-battlesuit-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.02-sns-battlesuit-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.02-sns-battlesuit-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.02-sns-battlesuit-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.02-tz-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.02-tz-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.02-tz-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.02-tz-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.03-starlance-prime-focused-supply-a copy 2.json b/public/data/versions/5.3/supply-events/v5.3-21.12.03-starlance-prime-focused-supply-a copy 2.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.03-starlance-prime-focused-supply-a copy 2.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.03-starlance-prime-focused-supply-a copy 2.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.06-hekate-s-gloom-focused-supply-a copy.json b/public/data/versions/5.3/supply-events/v5.3-21.12.06-hekate-s-gloom-focused-supply-a copy.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.06-hekate-s-gloom-focused-supply-a copy.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.06-hekate-s-gloom-focused-supply-a copy.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.10-mitternachts-waltz-schicksal-arsenal.json b/public/data/versions/5.3/supply-events/v5.3-21.12.10-mitternachts-waltz-schicksal-arsenal.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.10-mitternachts-waltz-schicksal-arsenal.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.10-mitternachts-waltz-schicksal-arsenal.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.10-nuada-s-grief-focused-supply-a.json b/public/data/versions/5.3/supply-events/v5.3-21.12.10-nuada-s-grief-focused-supply-a.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.10-nuada-s-grief-focused-supply-a.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.10-nuada-s-grief-focused-supply-a.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.10-pv-battlesuit-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.10-pv-battlesuit-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.10-pv-battlesuit-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.10-pv-battlesuit-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.13-star-shatterer-vikrant-focused-supply-b.json b/public/data/versions/5.3/supply-events/v5.3-21.12.13-star-shatterer-vikrant-focused-supply-b.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.13-star-shatterer-vikrant-focused-supply-b.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.13-star-shatterer-vikrant-focused-supply-b.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.17-hos-battlesuit-expansion-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.17-hos-battlesuit-expansion-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.17-hos-battlesuit-expansion-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.17-hos-battlesuit-expansion-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.17-key-of-oblivion-focused-supply-a.json b/public/data/versions/5.3/supply-events/v5.3-21.12.17-key-of-oblivion-focused-supply-a.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.17-key-of-oblivion-focused-supply-a.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.17-key-of-oblivion-focused-supply-a.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.20-nebulous-duality-focused-supply-b.json b/public/data/versions/5.3/supply-events/v5.3-21.12.20-nebulous-duality-focused-supply-b.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.20-nebulous-duality-focused-supply-b.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.20-nebulous-duality-focused-supply-b.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.24-expa-select-supply-round-1.json b/public/data/versions/5.3/supply-events/v5.3-21.12.24-expa-select-supply-round-1.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.24-expa-select-supply-round-1.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.24-expa-select-supply-round-1.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.24-foca-select-supply-round-1.json b/public/data/versions/5.3/supply-events/v5.3-21.12.24-foca-select-supply-round-1.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.24-foca-select-supply-round-1.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.24-foca-select-supply-round-1.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.24-sa-battlesuit-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.24-sa-battlesuit-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.24-sa-battlesuit-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.24-sa-battlesuit-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.24-sr-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.24-sr-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.24-sr-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.24-sr-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.27-bl-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.27-bl-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.27-bl-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.27-bl-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.27-expa-select-supply-round-2.json b/public/data/versions/5.3/supply-events/v5.3-21.12.27-expa-select-supply-round-2.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.27-expa-select-supply-round-2.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.27-expa-select-supply-round-2.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.27-foca-select-supply-round-2.json b/public/data/versions/5.3/supply-events/v5.3-21.12.27-foca-select-supply-round-2.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.27-foca-select-supply-round-2.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.27-foca-select-supply-round-2.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.29-expa-select-supply-round-3.json b/public/data/versions/5.3/supply-events/v5.3-21.12.29-expa-select-supply-round-3.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.29-expa-select-supply-round-3.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.29-expa-select-supply-round-3.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.29-foca-select-supply-round-3.json b/public/data/versions/5.3/supply-events/v5.3-21.12.29-foca-select-supply-round-3.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.29-foca-select-supply-round-3.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.29-foca-select-supply-round-3.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.29-tz-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.29-tz-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.29-tz-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.29-tz-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-21.12.31-se-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-21.12.31-se-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-21.12.31-se-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-21.12.31-se-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-22.01.03-we-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-22.01.03-we-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-22.01.03-we-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-22.01.03-we-elf-supply.json diff --git a/public/data/supply-events/global-americas/v5.3-22.01.05-bof-elf-supply.json b/public/data/versions/5.3/supply-events/v5.3-22.01.05-bof-elf-supply.json similarity index 100% rename from public/data/supply-events/global-americas/v5.3-22.01.05-bof-elf-supply.json rename to public/data/versions/5.3/supply-events/v5.3-22.01.05-bof-elf-supply.json diff --git a/public/data/versions/5.3/version-data.json b/public/data/versions/5.3/version-data.json new file mode 100644 index 00000000..21a362ca --- /dev/null +++ b/public/data/versions/5.3/version-data.json @@ -0,0 +1,8 @@ +{ + "version": "5.3", + "name": "Post Dusk Odyssey", + "duration": ["2021-12-02", "2022-01-13"], + "newBattlesuits": ["sns"], + "newWeapons": ["hekate-s-sombre", "miracle-kissy-pillow"], + "verified": true +} diff --git a/public/data/versions/5.4/description.md b/public/data/versions/5.4/description.md new file mode 100644 index 00000000..e69de29b diff --git a/public/data/versions/5.4/version-data.json b/public/data/versions/5.4/version-data.json new file mode 100644 index 00000000..4773afbe --- /dev/null +++ b/public/data/versions/5.4/version-data.json @@ -0,0 +1,8 @@ +{ + "version": "5.4", + "name": "Silverwing Beyond", + "duration": ["2022-01-13"], + "newBattlesuits": [], + "newWeapons": [], + "verified": false +} diff --git a/src/components/organisms/GanttChart.tsx b/src/components/organisms/GanttChart.tsx new file mode 100644 index 00000000..50bf2e1f --- /dev/null +++ b/src/components/organisms/GanttChart.tsx @@ -0,0 +1,176 @@ +import { Box, Flex, Text } from '@theme-ui/components' +import { + differenceInCalendarDays, + differenceInCalendarWeeks, + format, +} from 'date-fns' +import { times } from 'ramda' +import { useMemo, MouseEventHandler } from 'react' + +export interface GanttChartItem { + id: string + row: number + duration: [string, string] + label: React.ReactNode + onClick?: MouseEventHandler +} + +interface GanttChartProps { + startDate: string + endDate: string + today: string + items: GanttChartItem[] +} + +const GanttChart = ({ + startDate: startDateString, + endDate: endDateString, + today: todayDateString, + items, +}: GanttChartProps) => { + const startDate = new Date(startDateString) + const endDate = new Date(endDateString) + const todayDate = new Date(todayDateString) + + const totalDays = differenceInCalendarDays(endDate, startDate) + const totalWeeks = differenceInCalendarWeeks(endDate, startDate) + + const totalRow = useMemo(() => { + return items.reduce((max, item) => { + return item.row > max ? item.row : max + }, 1) + }, []) + + return ( + + + {times((index) => { + const weekNumber = index + 1 + return ( + + Week {weekNumber} + + ) + }, totalWeeks)} + + + {times((index) => { + return ( + + ) + }, totalDays)} + + + + Today ({format(todayDate, 'P')}) + + + {items.map((item) => { + const offset = + differenceInCalendarDays(new Date(item.duration[0]), startDate) * 40 + const length = + differenceInCalendarDays( + new Date(item.duration[1]), + new Date(item.duration[0]) + ) * 40 + + return ( + + {item.label} + + ) + })} + + + ) +} + +export default GanttChart diff --git a/src/components/organisms/Honkai3rdNavigator.tsx b/src/components/organisms/Honkai3rdNavigator.tsx index c8d039af..2d50d9a0 100644 --- a/src/components/organisms/Honkai3rdNavigator.tsx +++ b/src/components/organisms/Honkai3rdNavigator.tsx @@ -16,6 +16,11 @@ const Honkai3rdNavigator = () => { + + + Versions + + diff --git a/src/data/honkai3rd/supply-events.ts b/src/data/honkai3rd/supply-events.ts index 81cff7bc..deacd9ec 100644 --- a/src/data/honkai3rd/supply-events.ts +++ b/src/data/honkai3rd/supply-events.ts @@ -1,6 +1,6 @@ import { readdirSync, readJsonFileSync } from '../../lib/data' -export interface SupplyEvent { +export interface SupplyEventData { id: string verified: boolean track: number @@ -33,46 +33,20 @@ export interface SupplyEvent { }[] } -const supplyEventFileNameList = readdirSync('supply-events/global-americas') -const supplyEventFileList = supplyEventFileNameList - .map((fileName) => { - const filePathname = 'supply-events/global-americas/' + fileName - const data = readJsonFileSync(filePathname) +export function listSupplyEventsByVersion(version: string) { + const supplyEventsDirectoryPathname = `versions/${version}/supply-events` - return { ...data, id: fileName.replace(/\.json/, '') } as SupplyEvent - }) - .sort((a, b) => { - return -a.id.localeCompare(b.id) - }) + const supplyEventFileNameList = readdirSync(supplyEventsDirectoryPathname) + const supplyEventList = supplyEventFileNameList + .map((fileName) => { + const filePathname = `${supplyEventsDirectoryPathname}/` + fileName + const data = readJsonFileSync(filePathname) -const supplyEventMap = supplyEventFileList.reduce((map, stigmata) => { - map.set(stigmata.id, stigmata) - return map -}, new Map()) + return { ...data, id: fileName.replace(/\.json/, '') } as SupplyEventData + }) + .sort((a, b) => { + return -a.id.localeCompare(b.id) + }) -const versionSupplyEventListMap = supplyEventFileList.reduce( - (map, supplyEvent) => { - let supplyEvents = map.get(supplyEvent.version) - if (supplyEvents == null) { - supplyEvents = [] - map.set(supplyEvent.version, supplyEvents) - } - - supplyEvents.push(supplyEvent) - - return map - }, - new Map() -) - -export function listSupplyEvents() { - return supplyEventFileList -} - -export function getSupplyEventById(id: string) { - return supplyEventMap.get(id) -} - -export function getSupplyEventListByVersion(version: number) { - return versionSupplyEventListMap.get(version) || [] + return supplyEventList } diff --git a/src/data/honkai3rd/versions.ts b/src/data/honkai3rd/versions.ts new file mode 100644 index 00000000..2236bfde --- /dev/null +++ b/src/data/honkai3rd/versions.ts @@ -0,0 +1,52 @@ +import { format } from 'date-fns' +import { readdirSync, readFileSync, readJsonFileSync } from '../../lib/data' +import { compareVersion } from '../../lib/string' + +export interface VersionData { + version: string + name: string + duration: [string, string] + verified: boolean + newBattlesuits: string[] + newWeapons: string[] + description: string +} + +const versionDirectoryList = readdirSync('versions') + +const versionDataList = versionDirectoryList + .map((directoryName) => { + const directoryPathname = 'versions/' + directoryName + const data: VersionData = { + version: directoryName, + ...readJsonFileSync(directoryPathname + '/version-data.json'), + description: readFileSync( + directoryPathname + '/description.md' + ).toString(), + } + + return data + }) + .sort((a, b) => { + return compareVersion(b.version, a.version) + }) + +export function listVersionData() { + return versionDataList +} + +export function getVersion(version: number | string) { + return versionDataList.find((versionData) => { + return versionData.version.toString() === version.toString() + }) +} + +export function getCurrentVersion() { + const todayDateString = format(new Date(), 'yyyy-MM-dd') + + return versionDataList.find((versionData) => { + const [startDateString] = versionData.duration + + return startDateString.localeCompare(todayDateString) < 0 + }) +} diff --git a/src/lib/string.ts b/src/lib/string.ts new file mode 100644 index 00000000..2f390aa3 --- /dev/null +++ b/src/lib/string.ts @@ -0,0 +1,22 @@ +export function isVersionString(version: string): boolean { + return /[0-9]+\.[0-9]+(\.[0-9]+)?/.test(version) +} + +export function compareVersion(aVersion: string, bVersion: string): number { + const [aMajor, aMinor = '0', aPatch = '0'] = aVersion.split('.') + const [bMajor, bMinor = '0', bPatch = '0'] = bVersion.split('.') + + let result = parseInt(aMajor, 10) - parseInt(bMajor, 10) + + if (result !== 0) { + return result + } + + result = parseInt(aMinor, 10) - parseInt(bMinor, 10) + + if (result !== 0) { + return result + } + + return parseInt(aPatch, 10) - parseInt(bPatch, 10) +} diff --git a/src/pages/honkai3rd/supply-events/index.tsx b/src/pages/honkai3rd/supply-events/index.tsx deleted file mode 100644 index 26ec6ea2..00000000 --- a/src/pages/honkai3rd/supply-events/index.tsx +++ /dev/null @@ -1,420 +0,0 @@ -/** @jsxImportSource theme-ui */ -import { Text, Box, Heading, Link, Flex } from '@theme-ui/components' -import NextLink from 'next/link' -import Breadcrumb from '../../../components/organisms/Breadcrumb' -import Honkai3rdNavigator from '../../../components/organisms/Honkai3rdNavigator' -import { pick, times } from 'ramda' -import { - listSupplyEvents, - SupplyEvent, -} from '../../../data/honkai3rd/supply-events' -import { getStigmataById, StigmataData } from '../../../data/honkai3rd/stigmata' -import { getWeaponById, WeaponData } from '../../../data/honkai3rd/weapons' -import { - BattlesuitData, - getBattlesuitById, -} from '../../../data/honkai3rd/battlesuits' -import { ElfData, getElfById } from '../../../data/honkai3rd/elfs' -import { - format as formatDate, - differenceInCalendarDays, - differenceInCalendarWeeks, - format, -} from 'date-fns' -import SquareImageBox from '../../../components/atoms/SquareImageBox' -import { useMemo } from 'react' - -type ObjectMap = { [key: string]: T } -type StigmataObjectMap = ObjectMap> -type WeaponObjectMap = ObjectMap> -type BattlesuitObjectMap = ObjectMap> -type ElfObjectMap = ObjectMap> - -interface SupplyEventListPageProps { - supplyEventList: Pick< - SupplyEvent, - 'id' | 'version' | 'name' | 'featured' | 'duration' | 'track' | 'verified' - >[] - stigmataObjectMap: StigmataObjectMap - weaponObjectMap: WeaponObjectMap - battlesuitObjectMap: BattlesuitObjectMap - elfObjectMap: ElfObjectMap -} - -const SupplyEventListPage = ({ - supplyEventList, - battlesuitObjectMap, - weaponObjectMap, - stigmataObjectMap, - elfObjectMap, -}: SupplyEventListPageProps) => { - const startDate = new Date('2021-12-02') - const endDate = new Date('2022-01-13') - const todayDate = new Date(formatDate(new Date(), 'yyyy-MM-dd')) - - const totalDays = differenceInCalendarDays(endDate, startDate) - const totalWeeks = differenceInCalendarWeeks(endDate, startDate) - - const totalRow = useMemo(() => { - return supplyEventList.reduce((max, supplyEvent) => { - return supplyEvent.track > max ? supplyEvent.track : max - }, 1) - }, []) - - return ( - - - - - - - - Supply Events - - - - - {times((index) => { - const weekNumber = index + 1 - return ( - - Week {weekNumber} - - ) - }, totalWeeks)} - - - {times((index) => { - return ( - - ) - }, totalDays)} - - - - Today ({format(todayDate, 'P')}) - - - {supplyEventList - .slice() - .reverse() - .map((supplyEvent) => { - const offset = - differenceInCalendarDays( - new Date(supplyEvent.duration[0]), - startDate - ) * 40 - const length = - differenceInCalendarDays( - new Date(supplyEvent.duration[1]), - new Date(supplyEvent.duration[0]) - ) * 40 - - const featuredIconProps = getIconPropsOfItem( - supplyEvent.featured[0], - { - battlesuitObjectMap, - weaponObjectMap, - stigmataObjectMap, - elfObjectMap, - } - ) - return ( - - {featuredIconProps != null && ( - - )} - - {supplyEvent.name} - {!supplyEvent.verified && ' (❓)'} - - - ) - })} - - - - {supplyEventList.map((supplyEvent) => { - return ( - - - - - - [{supplyEvent.version}] {supplyEvent.name} ( - {supplyEvent.duration.join(' ~ ')}) - - - - - - {supplyEvent.featured.map((item) => { - const props = getIconPropsOfItem(item, { - battlesuitObjectMap, - weaponObjectMap, - stigmataObjectMap, - elfObjectMap, - }) - if (props == null) { - return ( - - {item.type} : {item.id} - - ) - } - return ( - - ) - })} - - - - ) - })} - - - - ) -} - -export default SupplyEventListPage - -export async function getStaticProps() { - const supplyEventList = listSupplyEvents() - - const stigmataObjectMap: { - [key: string]: Pick - } = {} - const weaponObjectMap: { - [key: string]: Pick - } = {} - const battlesuitObjectMap: { - [key: string]: Pick - } = {} - const elfObjectMap: { - [key: string]: Pick - } = {} - - supplyEventList.forEach((supplyEvent) => { - supplyEvent.featured.forEach((item) => { - switch (item.type) { - case 'battlesuit': - const battlesuit = getBattlesuitById(item.id) - if (battlesuit != null) { - battlesuitObjectMap[battlesuit.id] = pick( - ['id', 'name'], - battlesuit - ) - } - break - case 'weapon': - const weapon = getWeaponById(item.id) - if (weapon != null) { - weaponObjectMap[weapon.id] = pick(['id', 'name'], weapon) - } - break - case 'stigmata': - const stigmata = getStigmataById(item.id) - if (stigmata != null) { - stigmataObjectMap[stigmata.id] = pick(['id', 'name'], stigmata) - } - break - case 'elf': - const elf = getElfById(item.id) - if (elf != null) { - elfObjectMap[elf.id] = pick(['id', 'name'], elf) - } - break - } - }) - }) - return { - props: { - supplyEventList: supplyEventList.map((supplyEvent) => { - return pick( - [ - 'id', - 'version', - 'name', - 'featured', - 'duration', - 'track', - 'verified', - ], - supplyEvent - ) - }), - battlesuitObjectMap, - weaponObjectMap, - stigmataObjectMap, - elfObjectMap, - }, - revalidate: true, - } -} - -function getIconPropsOfItem( - item: { type: string; id: string }, - { - battlesuitObjectMap, - weaponObjectMap, - stigmataObjectMap, - elfObjectMap, - }: { - stigmataObjectMap: StigmataObjectMap - weaponObjectMap: WeaponObjectMap - battlesuitObjectMap: BattlesuitObjectMap - elfObjectMap: ElfObjectMap - } -): { src: string; alt: string } | null { - switch (item.type) { - case 'battlesuit': - const battlesuit = battlesuitObjectMap[item.id] - if (battlesuit != null) { - return { - src: `/assets/honkai3rd/battlesuits/portrait-${battlesuit.id}.png`, - alt: battlesuit.name, - } - } - case 'weapon': - const weapon = weaponObjectMap[item.id] - if (weapon != null) { - return { - src: `/assets/honkai3rd/weapons/${weapon.id}.png`, - alt: weapon.name, - } - } - case 'stigmata': - const stigmata = stigmataObjectMap[item.id] - if (stigmata != null) { - return { - src: `/assets/honkai3rd/stigmata/icon-${stigmata.id}.png`, - alt: stigmata.name, - } - } - case 'elf': - const elf = elfObjectMap[item.id] - if (elf != null) { - return { - src: `/assets/honkai3rd/elfs/icon-${elf.id}.png`, - alt: elf.name, - } - } - } - return null -} diff --git a/src/pages/honkai3rd/versions/[versionId].tsx b/src/pages/honkai3rd/versions/[versionId].tsx new file mode 100644 index 00000000..a521b211 --- /dev/null +++ b/src/pages/honkai3rd/versions/[versionId].tsx @@ -0,0 +1,47 @@ +/** @jsxImportSource theme-ui */ +import { NextPageContext } from 'next' +import { + getVersion, + listVersionData, + VersionData, +} from '../../../data/honkai3rd/versions' + +interface VersionShowPageProps { + versionData: VersionData +} + +const VersionShowPage = ({ versionData }: VersionShowPageProps) => { + return ( +
+ {versionData.version} : {versionData.name} +
+        {JSON.stringify(versionData, null, 2)}
+      
+
+ ) +} + +export default VersionShowPage + +export async function getStaticProps({ + params, +}: NextPageContext & { params: { versionId: string } }) { + return { + props: { + versionData: getVersion(params.versionId), + }, + } +} + +export async function getStaticPaths() { + return { + paths: listVersionData().map((versionData) => { + return { + params: { + versionId: versionData.version.toString(), + }, + } + }), + fallback: false, + } +} diff --git a/src/pages/honkai3rd/versions/index.tsx b/src/pages/honkai3rd/versions/index.tsx new file mode 100644 index 00000000..364c12df --- /dev/null +++ b/src/pages/honkai3rd/versions/index.tsx @@ -0,0 +1,218 @@ +/** @jsxImportSource theme-ui */ +import { Box, Flex, Heading, Link, Text } from '@theme-ui/components' +import { format } from 'date-fns' +import NextLink from 'next/link' +import SquareImageBox from '../../../components/atoms/SquareImageBox' +import Breadcrumb from '../../../components/organisms/Breadcrumb' +import GanttChart from '../../../components/organisms/GanttChart' +import Honkai3rdNavigator from '../../../components/organisms/Honkai3rdNavigator' +import { + BattlesuitData, + getBattlesuitById, +} from '../../../data/honkai3rd/battlesuits' +import { + listSupplyEventsByVersion, + SupplyEventData as SupplyEventData, +} from '../../../data/honkai3rd/supply-events' +import { + getCurrentVersion, + listVersionData, + VersionData, +} from '../../../data/honkai3rd/versions' +import { getWeaponById, WeaponData } from '../../../data/honkai3rd/weapons' + +interface VersionIndexPageProps { + versionDataList: VersionData[] + currentVersionData: VersionData + currentVersionNewBattlesuits: BattlesuitData[] + currentVersionNewWeapons: WeaponData[] + currentVersionSupplyEvents: SupplyEventData[] +} + +const VersionIndexPage = ({ + currentVersionData, + currentVersionNewBattlesuits, + versionDataList, + currentVersionNewWeapons, + currentVersionSupplyEvents, +}: VersionIndexPageProps) => { + return ( + + + + + + + + v{currentVersionData.version} : {currentVersionData.name} +
+ (Current Version) +
+ + + New Battlesuits + + {currentVersionNewBattlesuits.map((battlesuit) => { + return ( + + + + + {battlesuit.name} + + + + ) + })} + + + New Weapons + + {currentVersionNewWeapons.map((weapon) => { + return ( + + + + + {weapon.name} + + + + ) + })} + + + + Supply Events + + { + const imgSrc = getIconSrcFromItem(supplyEventData.featured[0]) + return { + id: supplyEventData.id, + label: ( + + {imgSrc != null && ( + + )} + {supplyEventData.name} + + ), + duration: supplyEventData.duration, + row: supplyEventData.track, + } + })} + today={format(new Date(), 'yyyy-MM-dd')} + startDate={currentVersionData.duration[0]} + endDate={currentVersionData.duration[1]} + /> + + + + Learn more... + + +
+ + All Versions + + {versionDataList.map((versionData) => { + return ( + + + + + {versionData.version} : {versionData.name} ( + {format(new Date(versionData.duration[0]), 'yyyy/MM/dd')}- + {versionData.duration[1] != null + ? format( + new Date(versionData.duration[1]), + 'yyyy/MM/dd' + ) + : ''} + ) + + + + + ) + })} + +
+
+ ) +} + +export async function getStaticProps() { + const currentVersionData = getCurrentVersion()! + + const currentVersionNewBattlesuits = currentVersionData.newBattlesuits.map( + (battlesuitId) => { + return getBattlesuitById(battlesuitId) + } + ) + const currentVersionNewWeapons = currentVersionData.newWeapons.map( + (weaponId) => { + return getWeaponById(weaponId) + } + ) + + const currentVersionSupplyEvents = listSupplyEventsByVersion( + currentVersionData.version + ) + + return { + props: { + currentVersionData, + currentVersionNewBattlesuits, + currentVersionNewWeapons, + currentVersionSupplyEvents, + versionDataList: listVersionData(), + }, + } +} + +export default VersionIndexPage + +function getIconSrcFromItem(item: { type: string; id: string }): string | null { + switch (item.type) { + case 'battlesuit': + return `/assets/honkai3rd/battlesuits/portrait-${item.id}.png` + case 'weapon': + return `/assets/honkai3rd/weapons/${item.id}.png` + case 'stigmata': + return `/assets/honkai3rd/stigmata/icon-${item.id}.png` + case 'elf': + return `/assets/honkai3rd/elfs/icon-${item.id}.png` + } + return null +}