poi-plugin-quest-info-2 0.5.4 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,10 +9,12 @@ import {
9
9
  } from 'react-virtualized'
10
10
  import type { ListRowProps } from 'react-virtualized'
11
11
  import styled from 'styled-components'
12
- import { KcanotifyQuestExt, QUEST_STATUS } from '../questHelper'
12
+ import { QUEST_STATUS } from '../questHelper'
13
+ import type { UnionQuest } from '../questHelper'
13
14
  import { useLargeCard } from '../store'
14
15
  import { QuestCard } from './QuestCard'
15
16
  import { useIsQuestPluginTab } from '../poi/hooks'
17
+ import { QUEST_API_STATE } from '../poi/types'
16
18
 
17
19
  const QuestListWrapper = styled.div`
18
20
  flex: 1;
@@ -25,10 +27,29 @@ const cache = new CellMeasurerCache({
25
27
  fixedWidth: true,
26
28
  })
27
29
 
28
- const useQuestsRowRenderer = (quests: KcanotifyQuestExt[]) => {
30
+ const questStateToQuestStatus = (
31
+ state: QUEST_API_STATE | undefined
32
+ ): QUEST_STATUS => {
33
+ switch (state) {
34
+ case QUEST_API_STATE.DEFAULT:
35
+ return QUEST_STATUS.DEFAULT
36
+ case QUEST_API_STATE.COMPLETED:
37
+ return QUEST_STATUS.COMPLETED
38
+ case QUEST_API_STATE.IN_PROGRESS:
39
+ return QUEST_STATUS.IN_PROGRESS
40
+ default:
41
+ return QUEST_STATUS.DEFAULT
42
+ }
43
+ }
44
+
45
+ const useQuestsRowRenderer = (quests: UnionQuest[]) => {
29
46
  const rowRenderer = useCallback(
30
47
  ({ key, index, style, parent }: ListRowProps) => {
31
- const { gameId, code, name, desc, memo, active } = quests[index]
48
+ const quest = quests[index]
49
+ const { gameId } = quest
50
+ const { code, name, desc, memo } = quest.docQuest
51
+ const questStatus = questStateToQuestStatus(quest.gameQuest?.api_state)
52
+
32
53
  return (
33
54
  <CellMeasurer
34
55
  cache={cache}
@@ -45,7 +66,7 @@ const useQuestsRowRenderer = (quests: KcanotifyQuestExt[]) => {
45
66
  name={name}
46
67
  desc={desc}
47
68
  tips={memo}
48
- status={active ? QUEST_STATUS.InProgress : QUEST_STATUS.Default}
69
+ status={questStatus}
49
70
  ></QuestCard>
50
71
  </div>
51
72
  </CellMeasurer>
@@ -56,12 +77,11 @@ const useQuestsRowRenderer = (quests: KcanotifyQuestExt[]) => {
56
77
  return rowRenderer
57
78
  }
58
79
 
59
- export const QuestList: React.FC<{ quests: KcanotifyQuestExt[] }> = ({
60
- quests,
61
- }) => {
80
+ export const QuestList: React.FC<{ quests: UnionQuest[] }> = ({ quests }) => {
62
81
  const { largeCard } = useLargeCard()
63
82
  const activeTab = useIsQuestPluginTab()
64
83
  const listRef = useRef<List>(null)
84
+ const rowRenderer: ListRowRenderer = useQuestsRowRenderer(quests)
65
85
 
66
86
  useEffect(() => {
67
87
  const largeCardIdx = quests.findIndex((i) => i.gameId === largeCard)
@@ -81,8 +101,6 @@ export const QuestList: React.FC<{ quests: KcanotifyQuestExt[] }> = ({
81
101
  listRef.current?.recomputeRowHeights()
82
102
  }, [])
83
103
 
84
- const rowRenderer: ListRowRenderer = useQuestsRowRenderer(quests)
85
-
86
104
  if (!quests.length) {
87
105
  // Prevent Uncaught Error: Requested index 0 is outside of range 0..0
88
106
  // See https://github.com/bvaughn/react-virtualized/issues/1016
package/src/poi/hooks.ts CHANGED
@@ -25,9 +25,9 @@ export const usePluginTranslation = () => {
25
25
  }
26
26
 
27
27
  export const useGameQuest = () => {
28
- const [quests, setQuests] = useState<GameQuest[] | null>(null)
28
+ const [quests, setQuests] = useState<GameQuest[]>([])
29
29
  useEffect(() => {
30
- const listener = (quests: GameQuest[] | null) => setQuests(quests)
30
+ const listener = (quests: GameQuest[] | null) => setQuests(quests ?? [])
31
31
  // See reducer.ts
32
32
  return observePluginStore(listener, (i) => i?._?.questList)
33
33
  }, [])
package/src/poi/types.ts CHANGED
@@ -1,11 +1,14 @@
1
1
  import type { PluginState } from '../reducer'
2
2
 
3
+ export enum QUEST_API_STATE {
4
+ DEFAULT = 1,
5
+ IN_PROGRESS = 2,
6
+ COMPLETED = 3,
7
+ }
8
+
3
9
  // See https://github.com/poooi/poi/blob/master/views/redux/info/quests.es
4
10
  export type GameQuest = {
5
- // 1 Default
6
- // 2 In progress
7
- // 3 Completed
8
- api_state: 1 | 2 | 3
11
+ api_state: QUEST_API_STATE
9
12
  api_no: number
10
13
  api_title: string
11
14
  api_detail: string
@@ -1,6 +1,7 @@
1
1
  import { QuestData } from '../build/kcanotifyGamedata'
2
+ import { GameQuest, QUEST_API_STATE } from './poi/types'
2
3
 
3
- type KcanotifyQuest = {
4
+ type DocQuest = {
4
5
  code: string
5
6
  name: string
6
7
  desc: string
@@ -9,9 +10,10 @@ type KcanotifyQuest = {
9
10
  tracking?: number[][]
10
11
  }
11
12
 
12
- export type KcanotifyQuestExt = KcanotifyQuest & {
13
+ export type UnionQuest = {
13
14
  gameId: string
14
- active?: boolean
15
+ gameQuest?: GameQuest
16
+ docQuest: DocQuest
15
17
  }
16
18
 
17
19
  const questStartsFilter = (str: string) =>
@@ -26,16 +28,18 @@ export const quarterlyQuest = questStartsFilter('(季任)')
26
28
  // (年任) (年任 / x 月)
27
29
  export const yearlyQuest = questStartsFilter('(年任')
28
30
 
29
- export const isInProgressQuest = (quest: KcanotifyQuestExt) => quest.active
30
- export const isDailyQuest = (quest: KcanotifyQuestExt) =>
31
+ export const isInProgressQuest = (quest: UnionQuest) =>
32
+ quest.gameQuest?.api_state === QUEST_API_STATE.IN_PROGRESS ||
33
+ quest.gameQuest?.api_state === QUEST_API_STATE.COMPLETED
34
+ export const isDailyQuest = (quest: UnionQuest) =>
31
35
  dailyQuest.includes(quest.gameId)
32
- export const isWeeklyQuest = (quest: KcanotifyQuestExt) =>
36
+ export const isWeeklyQuest = (quest: UnionQuest) =>
33
37
  weeklyQuest.includes(quest.gameId)
34
- export const isMonthlyQuest = (quest: KcanotifyQuestExt) =>
38
+ export const isMonthlyQuest = (quest: UnionQuest) =>
35
39
  monthlyQuest.includes(quest.gameId)
36
- export const isQuarterlyQuest = (quest: KcanotifyQuestExt) =>
40
+ export const isQuarterlyQuest = (quest: UnionQuest) =>
37
41
  quarterlyQuest.includes(quest.gameId)
38
- export const isYearlyQuest = (quest: KcanotifyQuestExt) =>
42
+ export const isYearlyQuest = (quest: UnionQuest) =>
39
43
  yearlyQuest.includes(quest.gameId)
40
44
 
41
45
  export enum QUEST_CATEGORY {
@@ -154,28 +158,28 @@ export const guessQuestCategory = (
154
158
  }
155
159
  }
156
160
 
157
- export const isCompositionQuest = ({ code }: KcanotifyQuestExt) =>
161
+ export const isCompositionQuest = ({ code }: DocQuest) =>
158
162
  guessQuestCategory(code).type === QUEST_CATEGORY.Composition
159
- export const isSortieQuest = ({ code }: KcanotifyQuestExt) =>
163
+ export const isSortieQuest = ({ code }: DocQuest) =>
160
164
  guessQuestCategory(code).type === QUEST_CATEGORY.Sortie
161
- export const isExerciseQuest = ({ code }: KcanotifyQuestExt) =>
165
+ export const isExerciseQuest = ({ code }: DocQuest) =>
162
166
  guessQuestCategory(code).type === QUEST_CATEGORY.Exercise
163
- export const isExpeditionQuest = ({ code }: KcanotifyQuestExt) =>
167
+ export const isExpeditionQuest = ({ code }: DocQuest) =>
164
168
  guessQuestCategory(code).type === QUEST_CATEGORY.Expedition
165
- export const isSupplyOrDockingQuest = ({ code }: KcanotifyQuestExt) =>
169
+ export const isSupplyOrDockingQuest = ({ code }: DocQuest) =>
166
170
  guessQuestCategory(code).type === QUEST_CATEGORY.SupplyOrDocking
167
- export const isArsenalQuest = ({ code }: KcanotifyQuestExt) =>
171
+ export const isArsenalQuest = ({ code }: DocQuest) =>
168
172
  guessQuestCategory(code).type === QUEST_CATEGORY.Arsenal
169
- export const isModernizationQuest = ({ code }: KcanotifyQuestExt) =>
173
+ export const isModernizationQuest = ({ code }: DocQuest) =>
170
174
  guessQuestCategory(code).type === QUEST_CATEGORY.Modernization
171
- export const isUnknownCategoryQuest = ({ code }: KcanotifyQuestExt) =>
175
+ export const isUnknownCategoryQuest = ({ code }: DocQuest) =>
172
176
  // Starts with unknown character
173
177
  /^[^ABCDEFG]/.test(code)
174
178
 
175
179
  export enum QUEST_STATUS {
176
- Locked,
177
- Default,
178
- InProgress,
179
- Completed,
180
- AlreadyCompleted,
180
+ LOCKED,
181
+ DEFAULT,
182
+ IN_PROGRESS,
183
+ COMPLETED,
184
+ ALREADY_COMPLETED,
181
185
  }
@@ -1,13 +1,9 @@
1
1
  import { useCallback } from 'react'
2
- import { checkIsKcwikiSupportedLanguages } from '.'
3
2
  import { QuestData } from '../../build/kcanotifyGamedata'
4
- import {
5
- useActiveQuest,
6
- useGameQuest,
7
- usePluginTranslation,
8
- } from '../poi/hooks'
9
- import { getCategory, KcanotifyQuestExt } from '../questHelper'
10
- import { useKcwikiData } from './kcwiki'
3
+ import { useGameQuest, usePluginTranslation } from '../poi/hooks'
4
+ import { getCategory } from '../questHelper'
5
+ import type { UnionQuest } from '../questHelper'
6
+ import { useKcwikiData, checkIsKcwikiSupportedLanguages } from './kcwiki'
11
7
  import { useStore } from './store'
12
8
 
13
9
  const DEFAULT_LANG = 'ja-JP'
@@ -41,27 +37,21 @@ const useQuestMap = () => {
41
37
  return QuestData[lang]
42
38
  }
43
39
 
44
- export const useQuest = (): KcanotifyQuestExt[] => {
45
- const activeQuest = useActiveQuest()
46
- const questMap = useQuestMap()
40
+ export const useQuest = (): UnionQuest[] => {
41
+ const docQuestMap = useQuestMap()
47
42
  const gameQuest = useGameQuest()
48
43
  const {
49
44
  store: { syncWithGame },
50
45
  } = useStore()
51
46
 
52
- if (syncWithGame) {
53
- if (gameQuest == null) {
54
- // TODO tip use to sync quest data
55
- return []
56
- }
47
+ if (syncWithGame && gameQuest.length) {
57
48
  return gameQuest.map((quest) => {
58
49
  const gameId = String(quest.api_no)
59
- const active = gameId in activeQuest
60
- if (gameId in questMap) {
50
+ if (gameId in docQuestMap) {
61
51
  return {
62
52
  gameId,
63
- active,
64
- ...questMap[gameId as unknown as keyof typeof questMap],
53
+ gameQuest: quest,
54
+ docQuest: docQuestMap[gameId as keyof typeof docQuestMap],
65
55
  }
66
56
  }
67
57
 
@@ -69,18 +59,21 @@ export const useQuest = (): KcanotifyQuestExt[] => {
69
59
  // May be a new quest
70
60
  return {
71
61
  gameId,
72
- active,
73
- code: `${getCategory(quest.api_category).wikiSymbol}?`,
74
- name: quest.api_title,
75
- desc: quest.api_detail,
62
+ gameQuest: quest,
63
+ docQuest: {
64
+ code: `${getCategory(quest.api_category).wikiSymbol}?`,
65
+ name: quest.api_title,
66
+ desc: quest.api_detail,
67
+ },
76
68
  }
77
69
  })
78
70
  } else {
79
71
  // Return all recorded quests
80
- return Object.entries(questMap).map(([gameId, val]) => ({
72
+ return Object.entries(docQuestMap).map(([gameId, val]) => ({
81
73
  gameId,
82
- active: gameId in activeQuest,
83
- ...val,
74
+ // Maybe empty
75
+ gameQuest: gameQuest.find((quest) => quest.api_no === Number(gameId))!,
76
+ docQuest: val,
84
77
  }))
85
78
  }
86
79
  }
package/src/tags.ts CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  isUnknownCategoryQuest,
16
16
  isInProgressQuest,
17
17
  } from './questHelper'
18
+ import type { UnionQuest } from './questHelper'
18
19
 
19
20
  const yes = () => true as const
20
21
 
@@ -25,16 +26,21 @@ export const ALL_CATEGORY_TAG = {
25
26
 
26
27
  export const ALL_TYPE_TAG = ALL_CATEGORY_TAG
27
28
 
29
+ const withDocQuest =
30
+ (filterFn: (q: UnionQuest['docQuest']) => boolean) =>
31
+ (unionQuest: UnionQuest) =>
32
+ filterFn(unionQuest.docQuest)
33
+
28
34
  export const CATEGORY_TAGS = [
29
35
  ALL_CATEGORY_TAG,
30
- { name: 'Composition', filter: isCompositionQuest },
31
- { name: 'Sortie', filter: isSortieQuest },
32
- { name: 'Exercise', filter: isExerciseQuest },
33
- { name: 'Expedition', filter: isExpeditionQuest },
34
- { name: 'Supply / Docking', filter: isSupplyOrDockingQuest },
35
- { name: 'Arsenal', filter: isArsenalQuest },
36
- { name: 'Modernization', filter: isModernizationQuest },
37
- { name: 'Others', filter: isUnknownCategoryQuest },
36
+ { name: 'Composition', filter: withDocQuest(isCompositionQuest) },
37
+ { name: 'Sortie', filter: withDocQuest(isSortieQuest) },
38
+ { name: 'Exercise', filter: withDocQuest(isExerciseQuest) },
39
+ { name: 'Expedition', filter: withDocQuest(isExpeditionQuest) },
40
+ { name: 'Supply / Docking', filter: withDocQuest(isSupplyOrDockingQuest) },
41
+ { name: 'Arsenal', filter: withDocQuest(isArsenalQuest) },
42
+ { name: 'Modernization', filter: withDocQuest(isModernizationQuest) },
43
+ { name: 'Others', filter: withDocQuest(isUnknownCategoryQuest) },
38
44
  ] as const
39
45
 
40
46
  export const TYPE_TAGS = [