diff --git a/.github/labeler.yml b/.github/labeler.yml index 09d18937..a1d43d87 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,28 +1,28 @@ -"package: api": +'package: api': - any: - changed-files: - any-glob-to-any-file: - 'packages/api/**/*' -"package: icon": +'package: icon': - any: - changed-files: - any-glob-to-any-file: - 'packages/icon/**/*' -"package: style": +'package: style': - any: - changed-files: - any-glob-to-any-file: - 'packages/style/**/*' -"package: ui": +'package: ui': - any: - changed-files: - any-glob-to-any-file: - 'packages/ui/**/*' -"eslint": +'eslint': - any: - changed-files: - any-glob-to-any-file: @@ -30,21 +30,21 @@ - '.eslintrc*' - 'eslint.config.*' -"tsconfig": +'tsconfig': - any: - changed-files: - any-glob-to-any-file: - 'tooling/config-typescript/**/*' - 'tsconfig.json' -"documentation": +'documentation': - any: - changed-files: - any-glob-to-any-file: - 'docs/**/*' - 'README.md' -"build": +'build': - any: - changed-files: - any-glob-to-any-file: @@ -53,19 +53,19 @@ - 'packages/*/package.json' - 'apps/*/package.json' -"workflows": +'workflows': - any: - changed-files: - any-glob-to-any-file: - '.github/workflows/**/*' -"app: spectator": +'app: spectator': - any: - changed-files: - any-glob-to-any-file: - 'apps/spectator/**/*' -"app: manager": +'app: manager': - any: - changed-files: - any-glob-to-any-file: diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f0886c26..2be97416 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -6,7 +6,7 @@ on: - main - wip/* - release/** - types: [ opened, synchronize, reopened ] + types: [opened, synchronize, reopened] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000..aa6def38 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,33 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "singleQuote": true, + "jsxSingleQuote": false, + + // sort imports + "sortImports": { + "groups": [ + "type-import", + ["value-builtin", "value-external"], + "type-internal", + "value-internal", + ["type-parent", "type-sibling", "type-index"], + ["value-parent", "value-sibling", "value-index"], + "unknown" + ], + "order": "asc" + }, + + // sort tailwindcss classes + "sortTailwindcss": { + "stylesheet": "./apps/spectator/src/styles/globals.css", + "functions": ["clsx", "cn"], + "preserveWhitespace": true + }, + + // sort package.json fields + "sortPackageJson": { + "sortScripts": true + }, + + "ignorePatterns": [] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..0253fe3f --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,72 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "react", "unicorn", "jsx-a11y"], + "categories": { + "correctness": "warn" + }, + "rules": { + "typescript/no-floating-promises": "error", + "typescript/no-unsafe-assignment": "warn", + "unicorn/prefer-node-protocol": "off", + "typescript/no-non-null-assertion": "warn", + "eslint/prefer-template": "warn", + "typescript/consistent-type-imports": "error", + "typescript/consistent-type-exports": "error", + "eslint/no-param-reassign": "error", + "typescript/prefer-as-const": "error", + "eslint/default-param-last": "error", + "typescript/prefer-enum-initializers": "error", + "react/self-closing-comp": "error", + "eslint/one-var": ["error", "never"], + "unicorn/prefer-number-properties": "error", + "typescript/no-inferrable-types": "error", + "eslint/no-else-return": "error", + "eslint/dot-notation": "off", + "typescript/ban-types": "off", + "unicorn/no-array-for-each": "off", + "react-hooks/exhaustive-deps": "warn", + "typescript/no-unused-vars": [ + "error", + { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_", "caughtErrors": "none" } + ], + "react/no-danger": "warn", + "typescript/no-explicit-any": "warn", + "react/no-array-index-key": "warn", + "jsx-a11y/button-has-type": "off", + "jsx-a11y/click-events-have-key-events": "off" + }, + "settings": { + "jsx-a11y": { + "polymorphicPropName": null, + "components": {}, + "attributes": {} + }, + "next": { + "rootDir": [] + }, + "react": { + "formComponents": [], + "linkComponents": [], + "version": null, + "componentWrapperFunctions": [] + }, + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + }, + "vitest": { + "typecheck": false + } + }, + "env": { + "builtin": true + }, + "globals": {}, + "ignorePatterns": [] +} diff --git a/apps/manager/package.json b/apps/manager/package.json index 91b268d1..ebc8bb48 100644 --- a/apps/manager/package.json +++ b/apps/manager/package.json @@ -3,18 +3,12 @@ "version": "0.0.1", "private": true, "scripts": { - "dev": "next dev --turbopack --port 11114 --hostname 0.0.0.0", "build": "next build", - "start": "next start", - "lint": "biome lint .", - "lint:fix": "biome lint --fix .", - "format": "biome format --write ." - }, - "lint-staged": { - "*.{js,jsx,ts,tsx}": [ - "biome lint --fix", - "biome format --write" - ] + "dev": "next dev --turbopack --port 11114 --hostname 0.0.0.0", + "format": "oxfmt", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "start": "next start" }, "dependencies": { "@bprogress/next": "^3.2.12", diff --git a/apps/manager/postcss.config.mjs b/apps/manager/postcss.config.mjs index c7bcb4b1..ba720fe5 100644 --- a/apps/manager/postcss.config.mjs +++ b/apps/manager/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: ['@tailwindcss/postcss'], }; export default config; diff --git a/apps/manager/src/api/mutations/useCreateGames.ts b/apps/manager/src/api/mutations/useCreateGames.ts index c50edbeb..4e4a4ba6 100644 --- a/apps/manager/src/api/mutations/useCreateGames.ts +++ b/apps/manager/src/api/mutations/useCreateGames.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { GameStateType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export type GameFormTeamType = { diff --git a/apps/manager/src/api/mutations/useCreateLeagues.ts b/apps/manager/src/api/mutations/useCreateLeagues.ts index 258464d7..c1194207 100644 --- a/apps/manager/src/api/mutations/useCreateLeagues.ts +++ b/apps/manager/src/api/mutations/useCreateLeagues.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { LeagueDetailType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export type LeagueFormType = Pick< diff --git a/apps/manager/src/api/mutations/useCreatePlayers.ts b/apps/manager/src/api/mutations/useCreatePlayers.ts index 59a0c50a..a7d13843 100644 --- a/apps/manager/src/api/mutations/useCreatePlayers.ts +++ b/apps/manager/src/api/mutations/useCreatePlayers.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { PlayerType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export type PlayerFormType = Pick; diff --git a/apps/manager/src/api/mutations/useCreateTeams.ts b/apps/manager/src/api/mutations/useCreateTeams.ts index 7085ab1a..f44baaad 100644 --- a/apps/manager/src/api/mutations/useCreateTeams.ts +++ b/apps/manager/src/api/mutations/useCreateTeams.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { TeamType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export type TeamFormType = Pick & { diff --git a/apps/manager/src/api/mutations/useCreateTimelinePK.ts b/apps/manager/src/api/mutations/useCreateTimelinePK.ts index 3944f67c..2285146a 100644 --- a/apps/manager/src/api/mutations/useCreateTimelinePK.ts +++ b/apps/manager/src/api/mutations/useCreateTimelinePK.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { PkType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const postTimelinePK = ({ gameId, ...request }: PkType) => { diff --git a/apps/manager/src/api/mutations/useCreateTimelineReplacement.ts b/apps/manager/src/api/mutations/useCreateTimelineReplacement.ts index cadc3a98..9da345a9 100644 --- a/apps/manager/src/api/mutations/useCreateTimelineReplacement.ts +++ b/apps/manager/src/api/mutations/useCreateTimelineReplacement.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { ReplacementType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const postTimelineReplace = ({ gameId, ...request }: ReplacementType) => { diff --git a/apps/manager/src/api/mutations/useCreateTimelineScore.ts b/apps/manager/src/api/mutations/useCreateTimelineScore.ts index ded27628..5f132c5a 100644 --- a/apps/manager/src/api/mutations/useCreateTimelineScore.ts +++ b/apps/manager/src/api/mutations/useCreateTimelineScore.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { ScoreType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const postTimelineScore = ({ gameId, ...request }: ScoreType) => { diff --git a/apps/manager/src/api/mutations/useCreateTimelineStatus.ts b/apps/manager/src/api/mutations/useCreateTimelineStatus.ts index 43589f4b..fe04c4e0 100644 --- a/apps/manager/src/api/mutations/useCreateTimelineStatus.ts +++ b/apps/manager/src/api/mutations/useCreateTimelineStatus.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { ProgressStateType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const postTimelineProgress = ({ gameId, ...request }: ProgressStateType) => { diff --git a/apps/manager/src/api/mutations/useCreateTimelineWarning.ts b/apps/manager/src/api/mutations/useCreateTimelineWarning.ts index 911be4b0..3f2f7e59 100644 --- a/apps/manager/src/api/mutations/useCreateTimelineWarning.ts +++ b/apps/manager/src/api/mutations/useCreateTimelineWarning.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { WarningType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const postTimelineWarning = ({ gameId, ...request }: WarningType) => { diff --git a/apps/manager/src/api/mutations/useDeleteLeagues.ts b/apps/manager/src/api/mutations/useDeleteLeagues.ts index da8483ed..905316a0 100644 --- a/apps/manager/src/api/mutations/useDeleteLeagues.ts +++ b/apps/manager/src/api/mutations/useDeleteLeagues.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useDeletePlayers.ts b/apps/manager/src/api/mutations/useDeletePlayers.ts index a57716c7..bccb5912 100644 --- a/apps/manager/src/api/mutations/useDeletePlayers.ts +++ b/apps/manager/src/api/mutations/useDeletePlayers.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useDeleteTeams.ts b/apps/manager/src/api/mutations/useDeleteTeams.ts index 02bdf974..9ff0a94d 100644 --- a/apps/manager/src/api/mutations/useDeleteTeams.ts +++ b/apps/manager/src/api/mutations/useDeleteTeams.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useDeleteTimeline.ts b/apps/manager/src/api/mutations/useDeleteTimeline.ts index 2af72879..2e9dfc2b 100644 --- a/apps/manager/src/api/mutations/useDeleteTimeline.ts +++ b/apps/manager/src/api/mutations/useDeleteTimeline.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdateCheerTalkBlock.ts b/apps/manager/src/api/mutations/useUpdateCheerTalkBlock.ts index ce035445..16967f11 100644 --- a/apps/manager/src/api/mutations/useUpdateCheerTalkBlock.ts +++ b/apps/manager/src/api/mutations/useUpdateCheerTalkBlock.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdateCheerTalkUnblock.ts b/apps/manager/src/api/mutations/useUpdateCheerTalkUnblock.ts index 9440d964..4274056a 100644 --- a/apps/manager/src/api/mutations/useUpdateCheerTalkUnblock.ts +++ b/apps/manager/src/api/mutations/useUpdateCheerTalkUnblock.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdateGames.ts b/apps/manager/src/api/mutations/useUpdateGames.ts index 57d39e2c..0002b96b 100644 --- a/apps/manager/src/api/mutations/useUpdateGames.ts +++ b/apps/manager/src/api/mutations/useUpdateGames.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { GameStateType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export type GameUpdateFormType = { diff --git a/apps/manager/src/api/mutations/useUpdateLeagueTeams.ts b/apps/manager/src/api/mutations/useUpdateLeagueTeams.ts index 1c962b70..ab2a2197 100644 --- a/apps/manager/src/api/mutations/useUpdateLeagueTeams.ts +++ b/apps/manager/src/api/mutations/useUpdateLeagueTeams.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { LeagueDetailType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdateLeagues.ts b/apps/manager/src/api/mutations/useUpdateLeagues.ts index b41a468c..1c1fdae6 100644 --- a/apps/manager/src/api/mutations/useUpdateLeagues.ts +++ b/apps/manager/src/api/mutations/useUpdateLeagues.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { LeagueDetailType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdatePlayers.ts b/apps/manager/src/api/mutations/useUpdatePlayers.ts index 352a692d..6446977f 100644 --- a/apps/manager/src/api/mutations/useUpdatePlayers.ts +++ b/apps/manager/src/api/mutations/useUpdatePlayers.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { PlayerFormType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/mutations/useUpdateTeams.ts b/apps/manager/src/api/mutations/useUpdateTeams.ts index 134579bc..64d2f781 100644 --- a/apps/manager/src/api/mutations/useUpdateTeams.ts +++ b/apps/manager/src/api/mutations/useUpdateTeams.ts @@ -1,5 +1,7 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import type { TeamFormType } from '~/api'; + import { queryKeys } from '~/api/queryKey'; type Request = { diff --git a/apps/manager/src/api/queries/useCheerTalkBlock.ts b/apps/manager/src/api/queries/useCheerTalkBlock.ts index 09abf8c0..49c54935 100644 --- a/apps/manager/src/api/queries/useCheerTalkBlock.ts +++ b/apps/manager/src/api/queries/useCheerTalkBlock.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { CheerTalkPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useCheerTalkBlock = (payload: CheerTalkPayload) => diff --git a/apps/manager/src/api/queries/useCheerTalkReport.ts b/apps/manager/src/api/queries/useCheerTalkReport.ts index 2ba7e438..0b7dc86e 100644 --- a/apps/manager/src/api/queries/useCheerTalkReport.ts +++ b/apps/manager/src/api/queries/useCheerTalkReport.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { CheerTalkPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useCheerTalkReport = (payload: CheerTalkPayload) => diff --git a/apps/manager/src/api/queries/useCheerTalks.ts b/apps/manager/src/api/queries/useCheerTalks.ts index fe06eef5..a38e807a 100644 --- a/apps/manager/src/api/queries/useCheerTalks.ts +++ b/apps/manager/src/api/queries/useCheerTalks.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { CheerTalkPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useCheerTalks = (payload: CheerTalkPayload) => diff --git a/apps/manager/src/api/queries/useGame.ts b/apps/manager/src/api/queries/useGame.ts index 3f17f6bb..a3ee6e3c 100644 --- a/apps/manager/src/api/queries/useGame.ts +++ b/apps/manager/src/api/queries/useGame.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGame = (payload: GameDetailPayload) => useQuery(queryKeys.games.detail(payload)); diff --git a/apps/manager/src/api/queries/useGameLineup.ts b/apps/manager/src/api/queries/useGameLineup.ts index 26b54c00..11100978 100644 --- a/apps/manager/src/api/queries/useGameLineup.ts +++ b/apps/manager/src/api/queries/useGameLineup.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameLineupPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameLineup = (payload: GameLineupPayload) => diff --git a/apps/manager/src/api/queries/useGameLineupPlaying.ts b/apps/manager/src/api/queries/useGameLineupPlaying.ts index 39885cc9..57d001d7 100644 --- a/apps/manager/src/api/queries/useGameLineupPlaying.ts +++ b/apps/manager/src/api/queries/useGameLineupPlaying.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameLineupPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameLineupPlaying = (payload: GameLineupPayload) => diff --git a/apps/manager/src/api/queries/useGameTimeLine.ts b/apps/manager/src/api/queries/useGameTimeLine.ts index 067a2c66..8fe1ad73 100644 --- a/apps/manager/src/api/queries/useGameTimeLine.ts +++ b/apps/manager/src/api/queries/useGameTimeLine.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TimelinePayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameTimeline = (payload: TimelinePayload) => diff --git a/apps/manager/src/api/queries/useGames.ts b/apps/manager/src/api/queries/useGames.ts index bd5c853e..403b70d0 100644 --- a/apps/manager/src/api/queries/useGames.ts +++ b/apps/manager/src/api/queries/useGames.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameListPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGames = (payload: GameListPayload) => useQuery(queryKeys.games.list(payload)); diff --git a/apps/manager/src/api/queries/useLeague.ts b/apps/manager/src/api/queries/useLeague.ts index 301f8c12..e6f8aeb3 100644 --- a/apps/manager/src/api/queries/useLeague.ts +++ b/apps/manager/src/api/queries/useLeague.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeague = (payload: LeagueDetailPayload) => diff --git a/apps/manager/src/api/queries/useLeagueTeams.ts b/apps/manager/src/api/queries/useLeagueTeams.ts index 434740dc..749fe66d 100644 --- a/apps/manager/src/api/queries/useLeagueTeams.ts +++ b/apps/manager/src/api/queries/useLeagueTeams.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueTeamsPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueTeams = (payload: LeagueTeamsPayload) => diff --git a/apps/manager/src/api/queries/useLeagueTeamsPlayers.ts b/apps/manager/src/api/queries/useLeagueTeamsPlayers.ts index 39533f29..54a8951d 100644 --- a/apps/manager/src/api/queries/useLeagueTeamsPlayers.ts +++ b/apps/manager/src/api/queries/useLeagueTeamsPlayers.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueTeamsPlayersPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueTeamsPlayers = (payload: LeagueTeamsPlayersPayload) => diff --git a/apps/manager/src/api/queries/useLeaguesHome.ts b/apps/manager/src/api/queries/useLeaguesHome.ts index 62b3052f..aaaf28d9 100644 --- a/apps/manager/src/api/queries/useLeaguesHome.ts +++ b/apps/manager/src/api/queries/useLeaguesHome.ts @@ -1,4 +1,5 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import { queryKeys } from '../queryKey'; export const useLeaguesHome = () => useQuery(queryKeys.leagues.home); diff --git a/apps/manager/src/api/queries/useLeaguesLeague.ts b/apps/manager/src/api/queries/useLeaguesLeague.ts index 01f1e77d..a5a17f0b 100644 --- a/apps/manager/src/api/queries/useLeaguesLeague.ts +++ b/apps/manager/src/api/queries/useLeaguesLeague.ts @@ -1,4 +1,5 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import { queryKeys } from '../queryKey'; export const useLeaguesLeague = () => useQuery(queryKeys.leagues.league); diff --git a/apps/manager/src/api/queries/usePlayer.ts b/apps/manager/src/api/queries/usePlayer.ts index 75eb50b0..33a5acfd 100644 --- a/apps/manager/src/api/queries/usePlayer.ts +++ b/apps/manager/src/api/queries/usePlayer.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { PlayerDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const usePlayer = (payload: PlayerDetailPayload) => diff --git a/apps/manager/src/api/queries/usePlayers.ts b/apps/manager/src/api/queries/usePlayers.ts index 7f47e198..4f7171b8 100644 --- a/apps/manager/src/api/queries/usePlayers.ts +++ b/apps/manager/src/api/queries/usePlayers.ts @@ -1,4 +1,5 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import { queryKeys } from '../queryKey'; export const usePlayers = () => useQuery(queryKeys.players.list); diff --git a/apps/manager/src/api/queries/useTeam.ts b/apps/manager/src/api/queries/useTeam.ts index 7915b733..09c56fcb 100644 --- a/apps/manager/src/api/queries/useTeam.ts +++ b/apps/manager/src/api/queries/useTeam.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamDetailPayload } from '~/api'; + import { queryKeys } from '~/api/queryKey'; export const useTeam = ({ id }: TeamDetailPayload) => useQuery(queryKeys.teams.detail({ id })); diff --git a/apps/manager/src/api/queries/useTeams.ts b/apps/manager/src/api/queries/useTeams.ts index 7c17eba8..24e4f040 100644 --- a/apps/manager/src/api/queries/useTeams.ts +++ b/apps/manager/src/api/queries/useTeams.ts @@ -1,4 +1,5 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import { queryKeys } from '../queryKey'; export const useTeams = () => useQuery(queryKeys.teams.list); diff --git a/apps/manager/src/api/queryKey.ts b/apps/manager/src/api/queryKey.ts index 483a804c..1c11c1c2 100644 --- a/apps/manager/src/api/queryKey.ts +++ b/apps/manager/src/api/queryKey.ts @@ -1,5 +1,6 @@ import { fetcher } from '@hcc/api-base'; import { createQueryKeys, mergeQueryKeys } from '@lukemorales/query-key-factory'; + import type { CheerTalkPayload, CheerTalkType, diff --git a/apps/manager/src/app/(private)/_components/bottom-menu.tsx b/apps/manager/src/app/(private)/_components/bottom-menu.tsx index 3afb7cf5..973fd2ed 100644 --- a/apps/manager/src/app/(private)/_components/bottom-menu.tsx +++ b/apps/manager/src/app/(private)/_components/bottom-menu.tsx @@ -1,11 +1,12 @@ import { GroupIcon, PersonIcon, RewardedAdsIcon, SmsIcon } from '@hcc/icons'; import { Button } from '@hcc/ui'; import Link from 'next/link'; + import { routes } from '~/constants/routes'; export const BottomMenu = () => { return ( -
+
- {TABS_CONFIG.find(tab => tab.key === activeTab)?.renderer() || null} + {TABS_CONFIG.find((tab) => tab.key === activeTab)?.renderer() || null}
); diff --git a/apps/manager/src/app/(private)/cheertalks/blocked/blocked-list.tsx b/apps/manager/src/app/(private)/cheertalks/blocked/blocked-list.tsx index d7ca4808..2549318c 100644 --- a/apps/manager/src/app/(private)/cheertalks/blocked/blocked-list.tsx +++ b/apps/manager/src/app/(private)/cheertalks/blocked/blocked-list.tsx @@ -1,6 +1,7 @@ 'use client'; import { useSuspenseCheerTalkBlock } from '~/api'; + import { CheerTalkList } from '../_components/cheertalk-list'; export const BlockedList = () => { diff --git a/apps/manager/src/app/(private)/cheertalks/blocked/page.tsx b/apps/manager/src/app/(private)/cheertalks/blocked/page.tsx index 3d389ad6..60b41424 100644 --- a/apps/manager/src/app/(private)/cheertalks/blocked/page.tsx +++ b/apps/manager/src/app/(private)/cheertalks/blocked/page.tsx @@ -1,6 +1,8 @@ import { Spinner } from '@hcc/ui'; import { Suspense } from '@suspensive/react'; + import { Header } from '~/components/layout'; + import { BlockedList } from './blocked-list'; const Page = () => { diff --git a/apps/manager/src/app/(private)/cheertalks/page.tsx b/apps/manager/src/app/(private)/cheertalks/page.tsx index 4966e908..70fe4776 100644 --- a/apps/manager/src/app/(private)/cheertalks/page.tsx +++ b/apps/manager/src/app/(private)/cheertalks/page.tsx @@ -1,8 +1,10 @@ import { colors, Spinner, Typography } from '@hcc/ui'; import { Suspense } from '@suspensive/react'; import Link from 'next/link'; + import { Header } from '~/components/layout'; import { routes } from '~/constants/routes'; + import { CheerTalkTabs } from './_components/cheertalk-tab'; const BlockedTalkMenu = () => ( diff --git a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/form-section.tsx b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/form-section.tsx index 3f14c700..c93a90ae 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/form-section.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/form-section.tsx @@ -3,6 +3,7 @@ import { Button, Input, Select, Typography, toast } from '@hcc/ui'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; + import { type GameUpdateFormType, useSuspenseGame, useSuspenseLeague, useUpdateGames } from '~/api'; import { quarterOptions, roundOptions, stateOptions } from '~/constants/leagues'; import { handleFormError } from '~/utils/form-util'; @@ -31,7 +32,7 @@ export const FormSection = ({ leagueId, gameId }: Props) => { toast.success('경기가 수정되었습니다.'); router.back(); }, - onError: error => { + onError: (error) => { console.error(`[manager/leagues/${leagueId}]`, error); toast.error('경기 수정에 실패했습니다. 잠시 후 다시 시도해주세요.'); }, @@ -61,8 +62,8 @@ export const FormSection = ({ leagueId, gameId }: Props) => { required > {roundOptions - .filter(item => league.maxRound >= item.round) - .map(item => ( + .filter((item) => league.maxRound >= item.round) + .map((item) => ( diff --git a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/game-delete-menu.tsx b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/game-delete-menu.tsx index 9c073658..38c712b7 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/game-delete-menu.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/game-delete-menu.tsx @@ -2,6 +2,7 @@ import { colors, Typography, toast } from '@hcc/ui'; import { useRouter } from 'next/navigation'; + import { useDeleteGames } from '~/api'; import { AlertDialog } from '~/components/ui'; diff --git a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/page.tsx b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/page.tsx index db2f94e2..c27cf620 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/page.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/page.tsx @@ -1,7 +1,9 @@ import { Suspense } from '@suspensive/react'; import { notFound } from 'next/navigation'; + import { GameDeleteMenu } from '~/app/(private)/leagues/[id]/[gameId]/game-delete-menu'; import { Header } from '~/components/layout'; + import { FormSection } from './form-section'; type Props = { diff --git a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/page.tsx b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/page.tsx index 13bb5d0f..ef2a8c64 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/page.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/page.tsx @@ -1,6 +1,8 @@ import { ErrorBoundary, Suspense } from '@suspensive/react'; import { notFound } from 'next/navigation'; + import { Header } from '~/components/layout'; + import { TimelineDeleteMenu } from '../../_components/timeline-tab/timeline-delete'; import TimelineClient from './timelineClient'; diff --git a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/timelineClient.tsx b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/timelineClient.tsx index ba0f506c..b85b641a 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/timelineClient.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/[gameId]/timeline/timelineClient.tsx @@ -3,6 +3,7 @@ import { Spinner } from '@hcc/ui'; import { lazy, Suspense, useCallback, useMemo, useState } from 'react'; import { Drawer } from 'vaul'; + import { Timeline } from '../../_components/timeline'; import { BottomButton, type BottomSheetType } from '../../_components/timeline-tab/bottom-button'; @@ -49,7 +50,7 @@ export default function TimelineClient({ gameId }: { gameId: number }) {
{ + onOpenChange={(isOpen) => { if (!isOpen) close(); }} > @@ -59,7 +60,7 @@ export default function TimelineClient({ gameId }: { gameId: number }) {
{title && ( - + {title} )} diff --git a/apps/manager/src/app/(private)/leagues/[id]/_components/game-form/game-basic-info-step.tsx b/apps/manager/src/app/(private)/leagues/[id]/_components/game-form/game-basic-info-step.tsx index bbc29aa4..a7adc56b 100644 --- a/apps/manager/src/app/(private)/leagues/[id]/_components/game-form/game-basic-info-step.tsx +++ b/apps/manager/src/app/(private)/leagues/[id]/_components/game-form/game-basic-info-step.tsx @@ -1,6 +1,7 @@ import { Button, Input, Typography } from '@hcc/ui'; import { useMemo } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; + import { type GameFormType, useSuspenseLeague, useSuspenseLeagueTeams } from '~/api'; import { InputSelect } from '~/components/ui/input-select'; import { quarterOptions, roundOptions, stateOptions } from '~/constants/leagues'; @@ -28,19 +29,19 @@ export const GameBasicInfoStep = ({ leagueId, onNext }: Props) => { const isValid = Boolean( name?.trim() && - round && - quarter && - state && - startTime && - team1Id && - team2Id && - team1Id !== team2Id, + round && + quarter && + state && + startTime && + team1Id && + team2Id && + team1Id !== team2Id, ); const roundFilteredOptions = useMemo( () => roundOptions - .filter(item => league.maxRound >= item.round) - .map(item => ({ value: item.value.toString(), label: item.label })), + .filter((item) => league.maxRound >= item.round) + .map((item) => ({ value: item.value.toString(), label: item.label })), [league.maxRound], ); const quarterListOptions = Object.entries(quarterOptions).map(([key, value]) => ({ @@ -53,13 +54,13 @@ export const GameBasicInfoStep = ({ leagueId, onNext }: Props) => { label: value, })); - const teamOptions = teams.map(team => ({ + const teamOptions = teams.map((team) => ({ value: team.leagueTeamId.toString(), label: team.teamName, })); const handleTeamChange = (teamNum: 1 | 2, leagueTeamId: string) => { - const selectedTeam = teams.find(team => team.leagueTeamId.toString() === leagueTeamId); + const selectedTeam = teams.find((team) => team.leagueTeamId.toString() === leagueTeamId); if (selectedTeam) { setValue(`team${teamNum}.teamId`, selectedTeam.teamId); setValue(`team${teamNum}.leagueTeamId`, selectedTeam.leagueTeamId); @@ -143,7 +144,7 @@ export const GameBasicInfoStep = ({ leagueId, onNext }: Props) => { label="팀 선택 1" options={teamOptions} value={field.value?.toString()} - onValueChange={val => { + onValueChange={(val) => { field.onChange(val); handleTeamChange(1, val); }} @@ -159,7 +160,7 @@ export const GameBasicInfoStep = ({ leagueId, onNext }: Props) => { label="팀 선택 2" options={teamOptions} value={field.value?.toString()} - onValueChange={val => { + onValueChange={(val) => { field.onChange(val); handleTeamChange(2, val); }} @@ -169,7 +170,7 @@ export const GameBasicInfoStep = ({ leagueId, onNext }: Props) => {
-
+
); diff --git a/apps/manager/src/app/(private)/teams/_components/team-delete-dialog.tsx b/apps/manager/src/app/(private)/teams/_components/team-delete-dialog.tsx index 54c14e1c..105c2635 100644 --- a/apps/manager/src/app/(private)/teams/_components/team-delete-dialog.tsx +++ b/apps/manager/src/app/(private)/teams/_components/team-delete-dialog.tsx @@ -1,5 +1,7 @@ -import { toast } from '@hcc/ui'; import type { ReactNode } from 'react'; + +import { toast } from '@hcc/ui'; + import { useDeleteTeams } from '~/api'; import { AlertDialog } from '~/components/ui'; diff --git a/apps/manager/src/app/(private)/teams/_components/team-form.tsx b/apps/manager/src/app/(private)/teams/_components/team-form.tsx index dbe8b8fb..ee007703 100644 --- a/apps/manager/src/app/(private)/teams/_components/team-form.tsx +++ b/apps/manager/src/app/(private)/teams/_components/team-form.tsx @@ -1,11 +1,15 @@ -import { Suspense } from '@suspensive/react'; import type { ComponentProps } from 'react'; + +import { Suspense } from '@suspensive/react'; import { useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { twMerge } from 'tailwind-merge'; + import type { TeamFormType } from '~/api'; + import { SwitchCase } from '~/components/feature'; import { handleFormError } from '~/utils/form-util'; + import { StepProgress } from './step-progress'; import { TeamBasicInfoStep } from './team-basic-info-step'; import { TeamPlayersStep } from './team-players-step'; @@ -52,7 +56,7 @@ export const TeamForm = ({ className, onSubmit, initialData, ...props }: Props) step.title)} + steps={STEPS.map((step) => step.title)} /> { return (
- {data.map(team => ( + {data.map((team) => (
diff --git a/apps/manager/src/app/(private)/teams/_components/team-players-step.tsx b/apps/manager/src/app/(private)/teams/_components/team-players-step.tsx index a7563da4..ec16158f 100644 --- a/apps/manager/src/app/(private)/teams/_components/team-players-step.tsx +++ b/apps/manager/src/app/(private)/teams/_components/team-players-step.tsx @@ -2,6 +2,7 @@ import { CancelIcon } from '@hcc/icons'; import { Button, colors, Input, Typography, toast } from '@hcc/ui'; import { Fragment } from 'react'; import { Controller, useFieldArray, useFormContext } from 'react-hook-form'; + import { type TeamFormType, useSuspensePlayers } from '~/api'; import { PlayerAppendDialog } from '~/app/(private)/teams/_components/player-append-dialog'; @@ -20,7 +21,7 @@ export const TeamPlayersStep = ({ onPrevious }: Props) => { const isValid = teamPlayers.length > 0; const handleAppendPlayer = (id: number) => { - if (teamPlayers.find(player => player.playerId === id)) { + if (teamPlayers.find((player) => player.playerId === id)) { toast.error('이 선수는 이미 추가되었어요.'); return; } @@ -51,7 +52,7 @@ export const TeamPlayersStep = ({ onPrevious }: Props) => { player.playerId === field.playerId)?.name ?? '-'} + value={data.find((player) => player.playerId === field.playerId)?.name ?? '-'} disabled readOnly /> @@ -60,7 +61,7 @@ export const TeamPlayersStep = ({ onPrevious }: Props) => { size="lg" placeholder="학번" value={ - data.find(player => player.playerId === field.playerId)?.studentNumber ?? '-' + data.find((player) => player.playerId === field.playerId)?.studentNumber ?? '-' } disabled readOnly diff --git a/apps/manager/src/app/(private)/teams/create/form-section.tsx b/apps/manager/src/app/(private)/teams/create/form-section.tsx index 441485c5..9fd189ad 100644 --- a/apps/manager/src/app/(private)/teams/create/form-section.tsx +++ b/apps/manager/src/app/(private)/teams/create/form-section.tsx @@ -2,9 +2,12 @@ import { toast } from '@hcc/ui'; import { useRouter } from 'next/navigation'; + import type { TeamFormType } from '~/api'; + import { useCreateTeams } from '~/api'; import { useImageUpload } from '~/hooks'; + import { TeamForm } from '../_components/team-form'; export function FormSection() { diff --git a/apps/manager/src/app/(private)/teams/create/page.tsx b/apps/manager/src/app/(private)/teams/create/page.tsx index d98d7eb2..418dae98 100644 --- a/apps/manager/src/app/(private)/teams/create/page.tsx +++ b/apps/manager/src/app/(private)/teams/create/page.tsx @@ -1,4 +1,5 @@ import { Header } from '~/components/layout'; + import { FormSection } from './form-section'; const Page = () => { diff --git a/apps/manager/src/app/(private)/teams/page.tsx b/apps/manager/src/app/(private)/teams/page.tsx index 66feb359..62188be0 100644 --- a/apps/manager/src/app/(private)/teams/page.tsx +++ b/apps/manager/src/app/(private)/teams/page.tsx @@ -2,8 +2,10 @@ import { AddIcon } from '@hcc/icons'; import { Button, Spinner, Typography } from '@hcc/ui'; import { Suspense } from '@suspensive/react'; import Link from 'next/link'; + import { Header } from '~/components/layout'; import { routes } from '~/constants/routes'; + import { TeamList } from './_components/team-list'; const TeamEditMenu = ({ edit }: { edit: boolean }) => { diff --git a/apps/manager/src/app/(public)/auth/login/login-form.tsx b/apps/manager/src/app/(public)/auth/login/login-form.tsx index 7fde4c57..21761b4e 100644 --- a/apps/manager/src/app/(public)/auth/login/login-form.tsx +++ b/apps/manager/src/app/(public)/auth/login/login-form.tsx @@ -3,6 +3,7 @@ import { Button, Input, toast } from '@hcc/ui'; import { useRouter } from 'next/navigation'; import { type FormEvent, useId } from 'react'; + import { useLogin } from '~/api'; import { routes } from '~/constants/routes'; @@ -22,7 +23,7 @@ export const LoginForm = () => { onSuccess: () => { router.push(`/${routes.home}`); }, - onError: error => { + onError: (error) => { console.error(`[hcc] ${error}`); toast.error('아이디 또는 비밀번호 오류'); }, diff --git a/apps/manager/src/app/(public)/auth/login/page.tsx b/apps/manager/src/app/(public)/auth/login/page.tsx index 73cedaf2..c9323683 100644 --- a/apps/manager/src/app/(public)/auth/login/page.tsx +++ b/apps/manager/src/app/(public)/auth/login/page.tsx @@ -1,11 +1,12 @@ import { Badge } from '@hcc/ui'; + import { LoginForm } from './login-form'; const Page = () => { return (
-

+

Hufscheer
manager diff --git a/apps/manager/src/app/(public)/auth/page.tsx b/apps/manager/src/app/(public)/auth/page.tsx index 509aeb11..d6f738c0 100644 --- a/apps/manager/src/app/(public)/auth/page.tsx +++ b/apps/manager/src/app/(public)/auth/page.tsx @@ -1,4 +1,5 @@ import { redirect } from 'next/navigation'; + import { routes } from '~/constants/routes'; const Page = () => { diff --git a/apps/manager/src/app/layout.tsx b/apps/manager/src/app/layout.tsx index 762464fa..3a25ef41 100644 --- a/apps/manager/src/app/layout.tsx +++ b/apps/manager/src/app/layout.tsx @@ -1,11 +1,13 @@ import '@hcc/ui/styles.css'; import '~/styles/globals.css'; +import type { Metadata } from 'next'; +import type { PropsWithChildren } from 'react'; import { Toaster } from '@hcc/ui'; import { Analytics } from '@vercel/analytics/next'; -import type { Metadata } from 'next'; -import type { PropsWithChildren } from 'react'; + import { Layout } from '~/components/layout'; + import { Pretendard } from './_fonts'; import { Provider } from './provider'; diff --git a/apps/manager/src/app/provider.tsx b/apps/manager/src/app/provider.tsx index 0cec7b83..cdeba206 100644 --- a/apps/manager/src/app/provider.tsx +++ b/apps/manager/src/app/provider.tsx @@ -1,8 +1,9 @@ 'use client'; +import type { PropsWithChildren } from 'react'; + import { ProgressProvider } from '@bprogress/next/app'; import { QueryClientProvider } from '@hcc/api-base'; -import type { PropsWithChildren } from 'react'; export const Provider = ({ children }: PropsWithChildren) => { return ( diff --git a/apps/manager/src/components/layout/header.tsx b/apps/manager/src/components/layout/header.tsx index bf8e7f58..d68997e4 100644 --- a/apps/manager/src/components/layout/header.tsx +++ b/apps/manager/src/components/layout/header.tsx @@ -1,10 +1,12 @@ 'use client'; +import type { ReactNode } from 'react'; + import { ArrowBackIcon, HCCLogo } from '@hcc/icons'; import { Typography } from '@hcc/ui'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; -import type { ReactNode } from 'react'; + import { routes } from '~/constants/routes'; type Props = @@ -15,8 +17,8 @@ export const Header = ({ arrow, title, menu }: Props) => { const router = useRouter(); return ( -
-
+
+
{arrow ? ( <> { ) : ( <> - + - 매니저 + 매니저
{menu ?? null}
diff --git a/apps/manager/src/components/ui/alert-dialog.tsx b/apps/manager/src/components/ui/alert-dialog.tsx index 64c218c3..119aa5c8 100644 --- a/apps/manager/src/components/ui/alert-dialog.tsx +++ b/apps/manager/src/components/ui/alert-dialog.tsx @@ -47,7 +47,7 @@ export const AlertDialog = ({ {children} - {title} + {title}
- {title} + {title} {content}
diff --git a/apps/manager/src/components/ui/input-date.tsx b/apps/manager/src/components/ui/input-date.tsx index 75528540..c1ff0e77 100644 --- a/apps/manager/src/components/ui/input-date.tsx +++ b/apps/manager/src/components/ui/input-date.tsx @@ -27,12 +27,12 @@ export const InputDate = ({ label, value, onSelect }: InputDateProps) => {

{label}

- {value &&

{formattedDate}

} + {value &&

{formattedDate}

}
@@ -43,7 +43,7 @@ export const InputDate = ({ label, value, onSelect }: InputDateProps) => {
- {label} + {label}
diff --git a/apps/manager/src/components/ui/input-select.tsx b/apps/manager/src/components/ui/input-select.tsx index 06e46d39..a6d2cadb 100644 --- a/apps/manager/src/components/ui/input-select.tsx +++ b/apps/manager/src/components/ui/input-select.tsx @@ -19,17 +19,17 @@ export const InputSelect = ({ options, placeholder, label, ...props }: BoxSelect : false; return ( - +
{label} {hasValue ? ( -

+

) : ( @@ -47,11 +47,11 @@ export const InputSelect = ({ options, placeholder, label, ...props }: BoxSelect className="z-[80] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-gray-200 bg-white shadow-lg" > - {options.map(option => ( + {options.map((option) => ( diff --git a/apps/manager/src/components/ui/step-progress.tsx b/apps/manager/src/components/ui/step-progress.tsx index abfe78ad..c877faf0 100644 --- a/apps/manager/src/components/ui/step-progress.tsx +++ b/apps/manager/src/components/ui/step-progress.tsx @@ -22,7 +22,7 @@ export const StepProgress = ({ steps, currentStep }: StepProgressProps) => {
{ > {isCompleted ? : stepNumber}
- {step} + {step}
{stepNumber < steps.length &&
} diff --git a/apps/manager/src/styles/globals.css b/apps/manager/src/styles/globals.css index c871147d..06168caf 100644 --- a/apps/manager/src/styles/globals.css +++ b/apps/manager/src/styles/globals.css @@ -1,3 +1,3 @@ -@import "tailwindcss"; -@import "@hcc/style/utilities.css"; -@import "@hcc/style/theme.css"; +@import 'tailwindcss'; +@import '@hcc/style/utilities.css'; +@import '@hcc/style/theme.css'; diff --git a/apps/manager/src/utils/form-util.ts b/apps/manager/src/utils/form-util.ts index 3f1e501e..813f1c26 100644 --- a/apps/manager/src/utils/form-util.ts +++ b/apps/manager/src/utils/form-util.ts @@ -1,9 +1,10 @@ -import { toast } from '@hcc/ui'; import type { FieldErrors } from 'react-hook-form'; +import { toast } from '@hcc/ui'; + export const handleFormError = (errors: FieldErrors) => { const messages = Object.values(errors) - .map(error => error?.message) + .map((error) => error?.message) .filter(Boolean); const [first, ...rest] = messages; diff --git a/apps/manager/tsconfig.json b/apps/manager/tsconfig.json index 01fc0125..300f41a7 100644 --- a/apps/manager/tsconfig.json +++ b/apps/manager/tsconfig.json @@ -2,8 +2,7 @@ "extends": "@hcc/typescript-config/nextjs.json", "compilerOptions": { "plugins": [{ "name": "next" }], - "baseUrl": ".", - "paths": { "~/*": ["src/*"] } + "paths": { "~/*": ["./src/*"] } }, "include": ["**/*.ts", "**/*.tsx", "next-env.d.ts", "next.config.ts", ".next/types/**/*.ts"], "exclude": ["node_modules"] diff --git a/apps/spectator/package.json b/apps/spectator/package.json index 1544cde5..c90680ef 100644 --- a/apps/spectator/package.json +++ b/apps/spectator/package.json @@ -3,17 +3,12 @@ "version": "0.0.1", "private": true, "scripts": { - "dev": "next dev --turbopack --port 11113 --hostname 0.0.0.0", "build": "next build", - "start": "next start", - "lint": "biome lint .", - "format": "biome format --write ." - }, - "lint-staged": { - "*.{js,jsx,ts,tsx}": [ - "biome lint --fix", - "biome format --write" - ] + "dev": "next dev --turbopack --port 11113 --hostname 0.0.0.0", + "format": "oxfmt", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "start": "next start" }, "dependencies": { "@base-ui/react": "^1.1.0", diff --git a/apps/spectator/postcss.config.mjs b/apps/spectator/postcss.config.mjs index c7bcb4b1..ba720fe5 100644 --- a/apps/spectator/postcss.config.mjs +++ b/apps/spectator/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: ['@tailwindcss/postcss'], }; export default config; diff --git a/apps/spectator/src/api/mutations/useCreateCheerTalk.ts b/apps/spectator/src/api/mutations/useCreateCheerTalk.ts index 906877cf..9da1183e 100644 --- a/apps/spectator/src/api/mutations/useCreateCheerTalk.ts +++ b/apps/spectator/src/api/mutations/useCreateCheerTalk.ts @@ -1,5 +1,6 @@ import { fetcher, useMutation } from '@hcc/api-base'; import { toast } from '@hcc/ui'; // 토스트 메시지를 위한 import + import type { CheerTalkType } from '~/api'; type Request = Pick; diff --git a/apps/spectator/src/api/mutations/useUpdateGameCheer.ts b/apps/spectator/src/api/mutations/useUpdateGameCheer.ts index 09aefdc1..7863f2dd 100644 --- a/apps/spectator/src/api/mutations/useUpdateGameCheer.ts +++ b/apps/spectator/src/api/mutations/useUpdateGameCheer.ts @@ -1,4 +1,5 @@ import { fetcher, useMutation, useQueryClient } from '@hcc/api-base'; + import { queryKeys } from '../queryKey'; export type Request = { diff --git a/apps/spectator/src/api/queries/useGame.ts b/apps/spectator/src/api/queries/useGame.ts index 3f17f6bb..a3ee6e3c 100644 --- a/apps/spectator/src/api/queries/useGame.ts +++ b/apps/spectator/src/api/queries/useGame.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGame = (payload: GameDetailPayload) => useQuery(queryKeys.games.detail(payload)); diff --git a/apps/spectator/src/api/queries/useGameCheer.ts b/apps/spectator/src/api/queries/useGameCheer.ts index 72367009..e8f56923 100644 --- a/apps/spectator/src/api/queries/useGameCheer.ts +++ b/apps/spectator/src/api/queries/useGameCheer.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameCheerPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameCheer = (payload: GameCheerPayload) => useQuery(queryKeys.games.cheer(payload)); diff --git a/apps/spectator/src/api/queries/useGameLineup.ts b/apps/spectator/src/api/queries/useGameLineup.ts index 26b54c00..11100978 100644 --- a/apps/spectator/src/api/queries/useGameLineup.ts +++ b/apps/spectator/src/api/queries/useGameLineup.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameLineupPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameLineup = (payload: GameLineupPayload) => diff --git a/apps/spectator/src/api/queries/useGameLineupPlaying.ts b/apps/spectator/src/api/queries/useGameLineupPlaying.ts index 39885cc9..57d001d7 100644 --- a/apps/spectator/src/api/queries/useGameLineupPlaying.ts +++ b/apps/spectator/src/api/queries/useGameLineupPlaying.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameLineupPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameLineupPlaying = (payload: GameLineupPayload) => diff --git a/apps/spectator/src/api/queries/useGameSearch.ts b/apps/spectator/src/api/queries/useGameSearch.ts index 5a89b8ea..42656aaf 100644 --- a/apps/spectator/src/api/queries/useGameSearch.ts +++ b/apps/spectator/src/api/queries/useGameSearch.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameSearchPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameSearch = (payload: GameSearchPayload) => diff --git a/apps/spectator/src/api/queries/useGameTimeline.ts b/apps/spectator/src/api/queries/useGameTimeline.ts index 067a2c66..8fe1ad73 100644 --- a/apps/spectator/src/api/queries/useGameTimeline.ts +++ b/apps/spectator/src/api/queries/useGameTimeline.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TimelinePayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameTimeline = (payload: TimelinePayload) => diff --git a/apps/spectator/src/api/queries/useGameVideo.ts b/apps/spectator/src/api/queries/useGameVideo.ts index 157696e8..c745b841 100644 --- a/apps/spectator/src/api/queries/useGameVideo.ts +++ b/apps/spectator/src/api/queries/useGameVideo.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameVideoPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGameVideo = (payload: GameVideoPayload) => useQuery(queryKeys.games.video(payload)); diff --git a/apps/spectator/src/api/queries/useGames.ts b/apps/spectator/src/api/queries/useGames.ts index bd5c853e..403b70d0 100644 --- a/apps/spectator/src/api/queries/useGames.ts +++ b/apps/spectator/src/api/queries/useGames.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { GameListPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useGames = (payload: GameListPayload) => useQuery(queryKeys.games.list(payload)); diff --git a/apps/spectator/src/api/queries/useLeague.ts b/apps/spectator/src/api/queries/useLeague.ts index 35d5f246..1aa18ee0 100644 --- a/apps/spectator/src/api/queries/useLeague.ts +++ b/apps/spectator/src/api/queries/useLeague.ts @@ -1,5 +1,7 @@ import { getQueryClient, useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeague = (payload: LeagueDetailPayload) => diff --git a/apps/spectator/src/api/queries/useLeagueRecentSummary.ts b/apps/spectator/src/api/queries/useLeagueRecentSummary.ts index 77397f03..f303b457 100644 --- a/apps/spectator/src/api/queries/useLeagueRecentSummary.ts +++ b/apps/spectator/src/api/queries/useLeagueRecentSummary.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueRecentSummaryPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueRecentSummary = (payload?: LeagueRecentSummaryPayload) => diff --git a/apps/spectator/src/api/queries/useLeagueStatistics.ts b/apps/spectator/src/api/queries/useLeagueStatistics.ts index 55ffcae8..4359aef1 100644 --- a/apps/spectator/src/api/queries/useLeagueStatistics.ts +++ b/apps/spectator/src/api/queries/useLeagueStatistics.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueStatisticsPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueStatistics = (payload: LeagueStatisticsPayload) => diff --git a/apps/spectator/src/api/queries/useLeagueTeams.ts b/apps/spectator/src/api/queries/useLeagueTeams.ts index b888702e..e4a57f45 100644 --- a/apps/spectator/src/api/queries/useLeagueTeams.ts +++ b/apps/spectator/src/api/queries/useLeagueTeams.ts @@ -1,5 +1,7 @@ import { getQueryClient, useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueTeamsPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueTeams = (payload: LeagueTeamsPayload) => diff --git a/apps/spectator/src/api/queries/useLeagueTopScorers.ts b/apps/spectator/src/api/queries/useLeagueTopScorers.ts index b73a3d77..5172fc5d 100644 --- a/apps/spectator/src/api/queries/useLeagueTopScorers.ts +++ b/apps/spectator/src/api/queries/useLeagueTopScorers.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueTopScorersPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagueTopScorers = (payload: LeagueTopScorersPayload) => diff --git a/apps/spectator/src/api/queries/useLeagues.ts b/apps/spectator/src/api/queries/useLeagues.ts index 5bf4cd03..00689509 100644 --- a/apps/spectator/src/api/queries/useLeagues.ts +++ b/apps/spectator/src/api/queries/useLeagues.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { LeagueListPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useLeagues = (payload: LeagueListPayload) => useQuery(queryKeys.leagues.list(payload)); diff --git a/apps/spectator/src/api/queries/useTeam.ts b/apps/spectator/src/api/queries/useTeam.ts index 1bf0fda4..a8020e87 100644 --- a/apps/spectator/src/api/queries/useTeam.ts +++ b/apps/spectator/src/api/queries/useTeam.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useTeam = (payload: TeamDetailPayload) => useQuery(queryKeys.teams.detail(payload)); diff --git a/apps/spectator/src/api/queries/useTeamGames.ts b/apps/spectator/src/api/queries/useTeamGames.ts index 8bf66975..c3682a6b 100644 --- a/apps/spectator/src/api/queries/useTeamGames.ts +++ b/apps/spectator/src/api/queries/useTeamGames.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamGamesPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useTeamGames = (payload: TeamGamesPayload) => useQuery(queryKeys.teams.games(payload)); diff --git a/apps/spectator/src/api/queries/useTeamPlayers.ts b/apps/spectator/src/api/queries/useTeamPlayers.ts index 5fdccf9c..9f71e0cf 100644 --- a/apps/spectator/src/api/queries/useTeamPlayers.ts +++ b/apps/spectator/src/api/queries/useTeamPlayers.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamDetailPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useTeamsPlayers = (payload: TeamDetailPayload) => diff --git a/apps/spectator/src/api/queries/useTeams.ts b/apps/spectator/src/api/queries/useTeams.ts index dae5c055..9fbfc687 100644 --- a/apps/spectator/src/api/queries/useTeams.ts +++ b/apps/spectator/src/api/queries/useTeams.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamListPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useTeams = (payload: TeamListPayload) => useQuery(queryKeys.teams.list(payload)); diff --git a/apps/spectator/src/api/queries/useTeamsSummary.ts b/apps/spectator/src/api/queries/useTeamsSummary.ts index 8bea7bf7..a6c2ddc2 100644 --- a/apps/spectator/src/api/queries/useTeamsSummary.ts +++ b/apps/spectator/src/api/queries/useTeamsSummary.ts @@ -1,5 +1,7 @@ import { useQuery, useSuspenseQuery } from '@hcc/api-base'; + import type { TeamListPayload } from '~/api'; + import { queryKeys } from '../queryKey'; export const useTeamsSummary = (payload: TeamListPayload) => diff --git a/apps/spectator/src/api/queryKey.ts b/apps/spectator/src/api/queryKey.ts index 2585adaa..e3043632 100644 --- a/apps/spectator/src/api/queryKey.ts +++ b/apps/spectator/src/api/queryKey.ts @@ -1,6 +1,8 @@ import { fetcher } from '@hcc/api-base'; import { createQueryKeys, mergeQueryKeys } from '@lukemorales/query-key-factory'; + import type { TimelinePayload, TimelineType } from '~/api/types/timelines'; + import type { CheerTalkPayload, CheerTalkType, @@ -92,7 +94,7 @@ const teamQueryKeys = createQueryKeys('teams', { if (payload.units) { const units = Array.isArray(payload.units) ? payload.units : [payload.units]; - units.forEach(u => params.append('units', u)); + units.forEach((u) => params.append('units', u)); } return fetcher.get('teams', { searchParams: params }); @@ -117,7 +119,7 @@ const teamQueryKeys = createQueryKeys('teams', { if (payload.units) { const units = Array.isArray(payload.units) ? payload.units : [payload.units]; - units.forEach(u => params.append('units', u)); + units.forEach((u) => params.append('units', u)); } return fetcher.get('teams/summary', { diff --git a/apps/spectator/src/app/(home)/_components/best-scorer.tsx b/apps/spectator/src/app/(home)/_components/best-scorer.tsx index 6b1f91f1..387a98d1 100644 --- a/apps/spectator/src/app/(home)/_components/best-scorer.tsx +++ b/apps/spectator/src/app/(home)/_components/best-scorer.tsx @@ -1,6 +1,7 @@ +import { Typography } from '@hcc/ui'; + import { useSuspenseLeagueRecentSummary } from '~/api/queries/useLeagueRecentSummary'; -import { Typography } from '@hcc/ui'; import { RankingBoard, RankingBoardItem, diff --git a/apps/spectator/src/app/(home)/_components/calendar-menu.tsx b/apps/spectator/src/app/(home)/_components/calendar-menu.tsx index e6f4bf54..72c6d821 100644 --- a/apps/spectator/src/app/(home)/_components/calendar-menu.tsx +++ b/apps/spectator/src/app/(home)/_components/calendar-menu.tsx @@ -1,6 +1,7 @@ import { CalendarMonthIcon } from '@hcc/icons'; import { Typography } from '@hcc/ui'; import Link from 'next/link'; + import { routes } from '~/constants/routes'; export const CalendarMenu = () => ( diff --git a/apps/spectator/src/app/(home)/_components/ranking-board/list.tsx b/apps/spectator/src/app/(home)/_components/ranking-board/list.tsx index e450414a..6dcf4c1a 100644 --- a/apps/spectator/src/app/(home)/_components/ranking-board/list.tsx +++ b/apps/spectator/src/app/(home)/_components/ranking-board/list.tsx @@ -1,5 +1,6 @@ -import { useRender } from '@base-ui/react'; import type { ComponentProps } from 'react'; + +import { useRender } from '@base-ui/react'; import { twMerge } from 'tailwind-merge'; interface ListProps extends useRender.ComponentProps<'ul'> {} diff --git a/apps/spectator/src/app/(home)/_components/ranking-board/root.tsx b/apps/spectator/src/app/(home)/_components/ranking-board/root.tsx index 4a482c22..2b5183f3 100644 --- a/apps/spectator/src/app/(home)/_components/ranking-board/root.tsx +++ b/apps/spectator/src/app/(home)/_components/ranking-board/root.tsx @@ -1,4 +1,5 @@ import type { ComponentProps } from 'react'; + import { twMerge } from 'tailwind-merge'; interface RankingBoardProps extends ComponentProps<'div'> {} diff --git a/apps/spectator/src/app/(home)/_components/ranking-board/title.tsx b/apps/spectator/src/app/(home)/_components/ranking-board/title.tsx index 5c49ff2f..d2693d94 100644 --- a/apps/spectator/src/app/(home)/_components/ranking-board/title.tsx +++ b/apps/spectator/src/app/(home)/_components/ranking-board/title.tsx @@ -1,6 +1,7 @@ -import { Typography } from '@hcc/ui'; import type { ComponentProps } from 'react'; +import { Typography } from '@hcc/ui'; + interface RankingBoardTitleProps extends ComponentProps<'p'> {} export const RankingBoardTitle = (props: RankingBoardTitleProps) => { diff --git a/apps/spectator/src/app/(home)/_components/recent-records.tsx b/apps/spectator/src/app/(home)/_components/recent-records.tsx index aa8eb60b..062a3352 100644 --- a/apps/spectator/src/app/(home)/_components/recent-records.tsx +++ b/apps/spectator/src/app/(home)/_components/recent-records.tsx @@ -1,5 +1,7 @@ -import { useSuspenseLeagueRecentSummary } from '~/api/queries/useLeagueRecentSummary'; import { Typography } from '@hcc/ui'; + +import { useSuspenseLeagueRecentSummary } from '~/api/queries/useLeagueRecentSummary'; + import { RankingBoard, RankingBoardItem, @@ -19,7 +21,7 @@ export const RecentRecords = () => { 최근 대회 기록 - {leagueRecentSummary.records.map(record => ( + {leagueRecentSummary.records.map((record) => ( {record.name} diff --git a/apps/spectator/src/app/(home)/_components/tab-header.tsx b/apps/spectator/src/app/(home)/_components/tab-header.tsx index 14e1c01b..1f3c2511 100644 --- a/apps/spectator/src/app/(home)/_components/tab-header.tsx +++ b/apps/spectator/src/app/(home)/_components/tab-header.tsx @@ -4,6 +4,8 @@ import { Tabs } from '@base-ui/react'; import Link from 'next/link'; import { useSelectedLayoutSegment } from 'next/navigation'; +import { cn } from '~/utils/cn'; + interface TabHeaderProps extends Tabs.Root.Props {} export const TabHeader = ({ children, ...props }: TabHeaderProps) => { @@ -12,7 +14,7 @@ export const TabHeader = ({ children, ...props }: TabHeaderProps) => { return ( - + 이전 대회} @@ -32,7 +34,10 @@ export const TabHeader = ({ children, ...props }: TabHeaderProps) => { const Tab = ({ children, className, ...props }: Tabs.Tab.Props) => { return ( {children} diff --git a/apps/spectator/src/app/(home)/_components/tab.tsx b/apps/spectator/src/app/(home)/_components/tab.tsx index ab11b115..8c74ab29 100644 --- a/apps/spectator/src/app/(home)/_components/tab.tsx +++ b/apps/spectator/src/app/(home)/_components/tab.tsx @@ -2,15 +2,15 @@ import { colors, Spinner, Typography } from '@hcc/ui'; import Link from 'next/link'; -import { Fragment, Suspense } from 'react'; import { useRouter } from 'next/navigation'; +import { Fragment, Suspense } from 'react'; import { useSuspenseGames } from '~/api'; import { GameCard } from '~/components/ui'; import { routes } from '~/constants/routes'; -import { RankingBoard } from './ranking-board'; import { BestScorer } from './best-scorer'; +import { RankingBoard } from './ranking-board'; import { RecentRecords } from './recent-records'; export const RecentTab = () => { @@ -22,7 +22,7 @@ export const RecentTab = () => { return (
- {playing.map(league => ( + {playing.map((league) => ( @@ -52,7 +52,7 @@ export const RecentTab = () => { })} ))} - {scheduled.map(league => ( + {scheduled.map((league) => ( diff --git a/apps/spectator/src/app/(home)/layout.tsx b/apps/spectator/src/app/(home)/layout.tsx index b6fae4ea..33ac6cf9 100644 --- a/apps/spectator/src/app/(home)/layout.tsx +++ b/apps/spectator/src/app/(home)/layout.tsx @@ -1,9 +1,9 @@ import '@hcc/ui/styles.css'; import '~/styles/globals.css'; - import type { PropsWithChildren } from 'react'; import { Header } from '~/components/layout'; + import { CalendarMenu } from './_components/calendar-menu'; import { TabHeader } from './_components/tab-header'; diff --git a/apps/spectator/src/app/(home)/previous/_components/league-card-list.tsx b/apps/spectator/src/app/(home)/previous/_components/league-card-list.tsx index cf50da3e..af581d5b 100644 --- a/apps/spectator/src/app/(home)/previous/_components/league-card-list.tsx +++ b/apps/spectator/src/app/(home)/previous/_components/league-card-list.tsx @@ -1,5 +1,6 @@ 'use client'; +import { ChevronForwardIcon } from '@hcc/icons'; import { colors, Typography } from '@hcc/ui'; import { ErrorBoundary, Suspense } from '@suspensive/react'; @@ -7,7 +8,6 @@ import { useSuspenseLeagues } from '~/api'; import { Skeleton } from '~/components/skeleton'; import * as LeagueCard from './league-card'; -import { ChevronForwardIcon } from '@hcc/icons'; interface Props { year: number; @@ -18,7 +18,7 @@ export const LeagueCardList = ({ year }: Props) => { return (
- {data.map(league => ( + {data.map((league) => ( @@ -30,7 +30,7 @@ export const LeagueCardList = ({ year }: Props) => {
- +
@@ -61,7 +61,7 @@ const StatisticsErrorFallback = ({ reset }: { reset: () => void }) => { 리그 통계 데이터가 집계되지 않았어요. - diff --git a/apps/spectator/src/app/(home)/previous/_components/league-card.tsx b/apps/spectator/src/app/(home)/previous/_components/league-card.tsx index 5d61efe1..2f37953b 100644 --- a/apps/spectator/src/app/(home)/previous/_components/league-card.tsx +++ b/apps/spectator/src/app/(home)/previous/_components/league-card.tsx @@ -59,7 +59,7 @@ export const Header = ({ className, ...props }: LeagueCardHeaderProps) => { {...props} >
-
+
{name} @@ -156,7 +156,7 @@ export const Scorers = ({ limit = 3, className, ...props }: LeagueCardScorersPro ) : (
    - {data.slice(0, limit).map(scorer => ( + {data.slice(0, limit).map((scorer) => (
  • { - limit?: number; -} +interface LeagueCardStatisticsProps extends ComponentProps<'div'> {} -export const Statistics = ({ limit = 3, className, ...props }: LeagueCardStatisticsProps) => { +export const Statistics = ({ className, ...props }: LeagueCardStatisticsProps) => { const { leagueId } = useLeagueCardContext(); const { data } = useSuspenseLeagueStatistics({ leagueId }); diff --git a/apps/spectator/src/app/(home)/previous/_components/year-filter.tsx b/apps/spectator/src/app/(home)/previous/_components/year-filter.tsx index d9e8ec64..0ad55a3e 100644 --- a/apps/spectator/src/app/(home)/previous/_components/year-filter.tsx +++ b/apps/spectator/src/app/(home)/previous/_components/year-filter.tsx @@ -1,4 +1,5 @@ import Link from 'next/link'; + import { FilterBadge } from '~/components/ui'; const SERVICE_START_YEAR = 2024; @@ -18,7 +19,7 @@ export const YearFilter = ({ selectedYear }: Props) => { return (
    - {years.map(_year => { + {years.map((_year) => { return (
    { return (
    - {games.slice(0, limit).map(game => { + {games.slice(0, limit).map((game) => { if (game.gameTeams.length < 2) return null; const [home, away] = @@ -30,7 +32,7 @@ export const MatchHistory = ({ games, teamName, limit = 3 }: MatchHistoryProps)
    {`${home.gameTeamName} {`${away.gameTeamName} { 아직 득점 기록이 없어요. )} - {scorers.slice(0, limit).map(player => ( + {scorers.slice(0, limit).map((player) => (
    {player.playerName} diff --git a/apps/spectator/src/app/(home)/teams/_components/score-modal.tsx b/apps/spectator/src/app/(home)/teams/_components/score-modal.tsx index 44984307..22976724 100644 --- a/apps/spectator/src/app/(home)/teams/_components/score-modal.tsx +++ b/apps/spectator/src/app/(home)/teams/_components/score-modal.tsx @@ -1,5 +1,7 @@ import { Modal } from '@hcc/ui'; + import type { TeamPlayerType } from '~/api'; + import { useSuspenseTeamsPlayers } from '~/api/queries/useTeamPlayers'; type Row = TeamPlayerType & { @@ -55,7 +57,7 @@ export function ScorersModal({ open, onOpenChange, teamName, teamId }: TopScorer
    -

    +

    {teamName} 득점왕

    @@ -65,27 +67,27 @@ export function ScorersModal({ open, onOpenChange, teamName, teamId }: TopScorer
    - - + - - - {rows.map(r => { + {rows.map((r) => { const isTopThree = r.rank <= 3; const fontWeightClass = isTopThree ? 'font-semibold bg-gray-100' : 'font-medium'; return ( - + @@ -115,7 +117,7 @@ export function ScorersModal({ open, onOpenChange, teamName, teamId }: TopScorer {/* Footer note */} -
    +

    * 득점왕 순위는 최대 20명까지 표시합니다.

    ** 모든 통계 기록은 리그가 종료된 이후 업데이트 됩니다.

    diff --git a/apps/spectator/src/app/(home)/teams/_components/tab.tsx b/apps/spectator/src/app/(home)/teams/_components/tab.tsx index 1c23f0f6..bee4a858 100644 --- a/apps/spectator/src/app/(home)/teams/_components/tab.tsx +++ b/apps/spectator/src/app/(home)/teams/_components/tab.tsx @@ -1,13 +1,15 @@ 'use client'; import { ErrorBoundary, Suspense } from '@suspensive/react'; +import { useState } from 'react'; + import { useSuspenseTeamsSummary } from '~/api'; + import { MatchHistory } from './match-history'; import { ScoreList } from './score-list'; +import { ScorersModal } from './score-modal'; import { TeamCard } from './team-card'; import { TeamFilter, useTeamUnits } from './team-filter'; -import { useState } from 'react'; -import { ScorersModal } from './score-modal'; type ModalPayload = { teamName: string; @@ -26,7 +28,7 @@ export const TeamTab = () => {
    - {data.map(team => ( + {data.map((team) => ( @@ -68,7 +70,7 @@ export const TeamTab = () => { { + onOpenChange={(next) => { if (!next) setModal(null); }} teamId={modal.teamId} diff --git a/apps/spectator/src/app/(home)/teams/_components/team-card.tsx b/apps/spectator/src/app/(home)/teams/_components/team-card.tsx index 697f15a9..33cdba82 100644 --- a/apps/spectator/src/app/(home)/teams/_components/team-card.tsx +++ b/apps/spectator/src/app/(home)/teams/_components/team-card.tsx @@ -1,12 +1,16 @@ +import type { ComponentProps } from 'react'; + +import { ChevronForwardIcon } from '@hcc/icons'; import { Typography } from '@hcc/ui'; import Image from 'next/image'; -import type { ComponentProps } from 'react'; +import Link from 'next/link'; import { twMerge } from 'tailwind-merge'; + import type { TeamDetailType } from '~/api'; -import ScoreBadge from './score-badge'; -import Link from 'next/link'; + import { routes } from '~/constants/routes'; -import { ChevronForwardIcon } from '@hcc/icons'; + +import ScoreBadge from './score-badge'; /* ------------------------------------------------------------------------------------------------- * TeamCard @@ -50,7 +54,7 @@ const TeamCardHeader = ({ team, className, ...props }: TeamCardHeaderProps) => { />
    )} - + {team.name}
    diff --git a/apps/spectator/src/app/(home)/teams/_components/team-filter/index.tsx b/apps/spectator/src/app/(home)/teams/_components/team-filter/index.tsx index 9a842dd8..85457921 100644 --- a/apps/spectator/src/app/(home)/teams/_components/team-filter/index.tsx +++ b/apps/spectator/src/app/(home)/teams/_components/team-filter/index.tsx @@ -1,9 +1,10 @@ 'use client'; import Conveyer from '@egjs/conveyer'; - import { useEffect, useRef } from 'react'; + import { TEAM_UNIT_LIST, type TeamUnitType } from '~/api'; import { FilterBadge } from '~/components/ui'; + import { useTeamUnits } from './useTeamUnits'; export const TeamFilter = () => { diff --git a/apps/spectator/src/app/(home)/teams/_components/team-filter/useTeamUnits.ts b/apps/spectator/src/app/(home)/teams/_components/team-filter/useTeamUnits.ts index 29154ece..4caabc18 100644 --- a/apps/spectator/src/app/(home)/teams/_components/team-filter/useTeamUnits.ts +++ b/apps/spectator/src/app/(home)/teams/_components/team-filter/useTeamUnits.ts @@ -1,12 +1,13 @@ import { parseAsArrayOf, parseAsString, useQueryState } from 'nuqs'; import { startTransition, useMemo } from 'react'; + import { TEAM_UNIT_LIST, type TeamUnitType } from '~/api'; export const useTeamUnits = () => { const [units, setUnits] = useQueryState('units', parseAsArrayOf(parseAsString).withDefault([])); const selected = useMemo( - () => units.filter(u => TEAM_UNIT_LIST.includes(u as TeamUnitType)) as TeamUnitType[], + () => units.filter((u) => TEAM_UNIT_LIST.includes(u as TeamUnitType)) as TeamUnitType[], [units], ); @@ -19,7 +20,7 @@ export const useTeamUnits = () => { } const isActive = selected.includes(unit); - const updated = isActive ? selected.filter(u => u !== unit) : [...selected, unit]; + const updated = isActive ? selected.filter((u) => u !== unit) : [...selected, unit]; startTransition(() => { setUnits(updated, { scroll: false, history: 'replace' }); diff --git a/apps/spectator/src/app/(home)/teams/page.tsx b/apps/spectator/src/app/(home)/teams/page.tsx index 82d85b7f..b8981fc6 100644 --- a/apps/spectator/src/app/(home)/teams/page.tsx +++ b/apps/spectator/src/app/(home)/teams/page.tsx @@ -1,7 +1,8 @@ import { Tabs } from '@base-ui/react'; -import { TeamTab } from './_components/tab'; import { ErrorBoundary, Suspense } from '@suspensive/react'; + import { ErrorMessage } from '../_components/error-message'; +import { TeamTab } from './_components/tab'; export default function Page() { return ( diff --git a/apps/spectator/src/app/calendar/_components/CalendarOverview.tsx b/apps/spectator/src/app/calendar/_components/CalendarOverview.tsx index a666e81d..d33d7e82 100644 --- a/apps/spectator/src/app/calendar/_components/CalendarOverview.tsx +++ b/apps/spectator/src/app/calendar/_components/CalendarOverview.tsx @@ -1,10 +1,13 @@ 'use client'; import { useMemo, useState } from 'react'; + +import type { GameType } from '~/api'; + +import { useSuspenseGameSearch } from '~/api'; + import { CalendarGrid } from './calendar-grid'; import { GameCard } from './GameCard'; -import { useSuspenseGameSearch } from '~/api'; -import type { GameType } from '~/api'; export const CalendarOverview = () => { const [current, setCurrent] = useState(() => new Date()); @@ -40,7 +43,7 @@ export const CalendarOverview = () => { const { gamesByDate, gameDates } = useMemo(() => { const group: Record = {}; - games.forEach(game => { + games.forEach((game) => { const dateObj = new Date(game.startTime); if (dateObj.getFullYear() === year && dateObj.getMonth() === month) { const date = dateObj.getDate(); @@ -79,7 +82,7 @@ export const CalendarOverview = () => { {filteredGames.length > 0 ? ( <> - {filteredGames.map(game => ( + {filteredGames.map((game) => ( -
    +
    router.push(`/games/${gameId}`)} - className="h-8 rounded-lg border-neutral-200 px-4 font-semibold text-neutral-600 text-xs hover:bg-neutral-50" + className="h-8 rounded-lg border-neutral-200 px-4 text-xs font-semibold text-neutral-600 hover:bg-neutral-50" > 중계 @@ -199,7 +201,7 @@ const GameCardMatch = ({ gameId, time, round, status, team1, team2 }: GameCardMa color="black" variant="subtle" onClick={() => router.push(`/games/${gameId}?cheer=1`)} - className="h-8 rounded-lg border-neutral-200 px-4 font-semibold text-neutral-600 text-xs hover:bg-neutral-50" + className="h-8 rounded-lg border-neutral-200 px-4 text-xs font-semibold text-neutral-600 hover:bg-neutral-50" > 응원 @@ -211,7 +213,7 @@ const GameCardMatch = ({ gameId, time, round, status, team1, team2 }: GameCardMa color="black" variant="subtle" onClick={() => router.push(`/games/${gameId}`)} - className="h-8 rounded-lg border-neutral-200 px-4 font-semibold text-neutral-600 text-xs hover:bg-neutral-50" + className="h-8 rounded-lg border-neutral-200 px-4 text-xs font-semibold text-neutral-600 hover:bg-neutral-50" > 기록 diff --git a/apps/spectator/src/app/calendar/_components/calendar-grid.tsx b/apps/spectator/src/app/calendar/_components/calendar-grid.tsx index d92d1582..03d6a479 100644 --- a/apps/spectator/src/app/calendar/_components/calendar-grid.tsx +++ b/apps/spectator/src/app/calendar/_components/calendar-grid.tsx @@ -34,7 +34,7 @@ export const CalendarGrid = ({ aria-label="이전 달" className="rounded-full p-1 transition-colors hover:bg-neutral-100" > - + @@ -53,8 +53,8 @@ export const CalendarGrid = ({ {/* Grid Content */}
    -
    - {['일', '월', '화', '수', '목', '금', '토'].map(d => ( +
    + {['일', '월', '화', '수', '목', '금', '토'].map((d) => (
    {d}
    @@ -62,12 +62,15 @@ export const CalendarGrid = ({
    - {days.map((d, i) => { - const isSelected = d === selectedDay; - const hasGame = d !== null && gameDates.includes(d); + {days.map((day) => { + const isSelected = day === selectedDay; + const hasGame = day !== null && gameDates.includes(day); return ( -
    - {d ? ( +
    + {day ? (
    {hasGame && !isSelected && ( @@ -80,7 +83,7 @@ export const CalendarGrid = ({
    ) : ( diff --git a/apps/spectator/src/app/calendar/page.tsx b/apps/spectator/src/app/calendar/page.tsx index 4d1f85eb..31b5db73 100644 --- a/apps/spectator/src/app/calendar/page.tsx +++ b/apps/spectator/src/app/calendar/page.tsx @@ -1,6 +1,8 @@ +import { Suspense } from '@suspensive/react'; + import { Header } from '~/components/layout'; + import { CalendarOverview } from './_components/CalendarOverview'; -import { Suspense } from '@suspensive/react'; const Page = () => { return ( diff --git a/apps/spectator/src/app/games/[id]/_components/banner.tsx b/apps/spectator/src/app/games/[id]/_components/banner.tsx index 460069f6..5988d87c 100644 --- a/apps/spectator/src/app/games/[id]/_components/banner.tsx +++ b/apps/spectator/src/app/games/[id]/_components/banner.tsx @@ -5,6 +5,7 @@ import { Badge, Typography } from '@hcc/ui'; import { Sofia_Sans } from 'next/font/google'; import Image from 'next/image'; import { twMerge } from 'tailwind-merge'; + import { type GameTeamType, useSuspenseGame } from '~/api'; const Sofia = Sofia_Sans({ subsets: ['latin'] }); @@ -51,10 +52,10 @@ export const Banner = ({ gameId }: Props) => {
    -
    diff --git a/apps/spectator/src/app/games/[id]/_components/cheer-talk/cheer-talk-form.tsx b/apps/spectator/src/app/games/[id]/_components/cheer-talk/cheer-talk-form.tsx index b2a0bfca..5acb0cfb 100644 --- a/apps/spectator/src/app/games/[id]/_components/cheer-talk/cheer-talk-form.tsx +++ b/apps/spectator/src/app/games/[id]/_components/cheer-talk/cheer-talk-form.tsx @@ -1,6 +1,7 @@ import { SendFillIcon } from '@hcc/icons'; import { type FormEvent, useCallback, useState } from 'react'; import { twMerge } from 'tailwind-merge'; + import { type GameStateType, type GameTeamType, useCreateCheerTalk } from '~/api'; interface CheerTalkFormProps { @@ -38,13 +39,13 @@ export const CheerTalkForm = ({ gameTeams, scrollToBottom, gameState }: CheerTal return (
    - {gameTeams.map(team => ( -
    +
    순위 학번 + 이름 + 득점
    {r.rank}