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.
- package/README.md +17 -2
- package/build/kcQuestsData/DATA_VERSION +1 -1
- package/build/kcQuestsData/index.ts +1 -1
- package/build/kcQuestsData/quests-scn.json +2417 -552
- package/build/kcanotifyGamedata/DATA_VERSION +1 -1
- package/build/kcanotifyGamedata/index.ts +1 -1
- package/build/kcanotifyGamedata/quests-en.json +30 -24
- package/build/kcanotifyGamedata/quests-jp.json +30 -24
- package/build/kcanotifyGamedata/quests-ko.json +31 -25
- package/build/kcanotifyGamedata/quests-scn.json +30 -23
- package/build/kcanotifyGamedata/quests-tcn.json +30 -23
- package/package.json +6 -5
- package/scripts/downloadKcanotifyGamedata.ts +9 -2
- package/src/Toolbar.tsx +6 -6
- package/src/__tests__/kcanotifyData.spec.ts +1 -1
- package/src/__tests__/kcwikiData.spec.ts +1 -1
- package/src/components/QuestCard.tsx +7 -7
- package/src/components/QuestList.tsx +27 -9
- package/src/poi/hooks.ts +2 -2
- package/src/poi/types.ts +7 -4
- package/src/questHelper.ts +26 -22
- package/src/store/quest.ts +20 -27
- package/src/tags.ts +14 -8
|
@@ -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 {
|
|
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
|
|
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
|
|
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={
|
|
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:
|
|
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[]
|
|
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
|
-
|
|
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
|
package/src/questHelper.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { QuestData } from '../build/kcanotifyGamedata'
|
|
2
|
+
import { GameQuest, QUEST_API_STATE } from './poi/types'
|
|
2
3
|
|
|
3
|
-
type
|
|
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
|
|
13
|
+
export type UnionQuest = {
|
|
13
14
|
gameId: string
|
|
14
|
-
|
|
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:
|
|
30
|
-
|
|
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:
|
|
36
|
+
export const isWeeklyQuest = (quest: UnionQuest) =>
|
|
33
37
|
weeklyQuest.includes(quest.gameId)
|
|
34
|
-
export const isMonthlyQuest = (quest:
|
|
38
|
+
export const isMonthlyQuest = (quest: UnionQuest) =>
|
|
35
39
|
monthlyQuest.includes(quest.gameId)
|
|
36
|
-
export const isQuarterlyQuest = (quest:
|
|
40
|
+
export const isQuarterlyQuest = (quest: UnionQuest) =>
|
|
37
41
|
quarterlyQuest.includes(quest.gameId)
|
|
38
|
-
export const isYearlyQuest = (quest:
|
|
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 }:
|
|
161
|
+
export const isCompositionQuest = ({ code }: DocQuest) =>
|
|
158
162
|
guessQuestCategory(code).type === QUEST_CATEGORY.Composition
|
|
159
|
-
export const isSortieQuest = ({ code }:
|
|
163
|
+
export const isSortieQuest = ({ code }: DocQuest) =>
|
|
160
164
|
guessQuestCategory(code).type === QUEST_CATEGORY.Sortie
|
|
161
|
-
export const isExerciseQuest = ({ code }:
|
|
165
|
+
export const isExerciseQuest = ({ code }: DocQuest) =>
|
|
162
166
|
guessQuestCategory(code).type === QUEST_CATEGORY.Exercise
|
|
163
|
-
export const isExpeditionQuest = ({ code }:
|
|
167
|
+
export const isExpeditionQuest = ({ code }: DocQuest) =>
|
|
164
168
|
guessQuestCategory(code).type === QUEST_CATEGORY.Expedition
|
|
165
|
-
export const isSupplyOrDockingQuest = ({ code }:
|
|
169
|
+
export const isSupplyOrDockingQuest = ({ code }: DocQuest) =>
|
|
166
170
|
guessQuestCategory(code).type === QUEST_CATEGORY.SupplyOrDocking
|
|
167
|
-
export const isArsenalQuest = ({ code }:
|
|
171
|
+
export const isArsenalQuest = ({ code }: DocQuest) =>
|
|
168
172
|
guessQuestCategory(code).type === QUEST_CATEGORY.Arsenal
|
|
169
|
-
export const isModernizationQuest = ({ code }:
|
|
173
|
+
export const isModernizationQuest = ({ code }: DocQuest) =>
|
|
170
174
|
guessQuestCategory(code).type === QUEST_CATEGORY.Modernization
|
|
171
|
-
export const isUnknownCategoryQuest = ({ code }:
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
180
|
+
LOCKED,
|
|
181
|
+
DEFAULT,
|
|
182
|
+
IN_PROGRESS,
|
|
183
|
+
COMPLETED,
|
|
184
|
+
ALREADY_COMPLETED,
|
|
181
185
|
}
|
package/src/store/quest.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { useCallback } from 'react'
|
|
2
|
-
import { checkIsKcwikiSupportedLanguages } from '.'
|
|
3
2
|
import { QuestData } from '../../build/kcanotifyGamedata'
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 = ():
|
|
45
|
-
const
|
|
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
|
-
|
|
60
|
-
if (gameId in questMap) {
|
|
50
|
+
if (gameId in docQuestMap) {
|
|
61
51
|
return {
|
|
62
52
|
gameId,
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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(
|
|
72
|
+
return Object.entries(docQuestMap).map(([gameId, val]) => ({
|
|
81
73
|
gameId,
|
|
82
|
-
|
|
83
|
-
|
|
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 = [
|