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

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 CHANGED
@@ -5,14 +5,29 @@
5
5
 
6
6
  A [poi](https://github.com/poooi/poi) plugin that helps you view quest info. Data maintained by [kcanotify-gamedata](https://github.com/antest1/kcanotify-gamedata) & [kc3-translations](https://github.com/KC3Kai/kc3-translations) & [kcQuests](https://github.com/kcwikizh/kcQuests).
7
7
 
8
+ ![image](https://user-images.githubusercontent.com/18554747/143771661-00965277-5c45-454d-b4f0-57083ec3065d.png)
9
+
8
10
  ## Installation
9
11
 
10
12
  Paste `poi-plugin-quest-info-2` in the plugins tab and click the install button.
11
13
 
14
+ ## Features
15
+
16
+ - Translated quest info.(English/Simplified Chinese/Traditional Chinese/Korean)
17
+ - Task panel translation.
18
+ - Quest search and filter.
19
+ - Sync with game quest data.
20
+ - Auto switch to quest tab when enter quest views.
21
+
12
22
  ## Thanks
13
23
 
14
24
  - [poi](https://github.com/poooi/poi)
15
- - [kcanotify-gamedata](https://github.com/antest1/kcanotify-gamedata)
16
- - [poi-plugin-tabex](https://github.com/momocow/poi-plugin-tabex)
17
25
  - [plugin-quest](https://github.com/poooi/plugin-quest)
26
+ - [kcanotify-gamedata](https://github.com/antest1/kcanotify-gamedata)
18
27
  - [kcQuests](https://github.com/kcwikizh/kcQuests)
28
+ - [舰娘百科](https://zh.kcwiki.cn/wiki/%E8%88%B0%E5%A8%98%E7%99%BE%E7%A7%91)
29
+ - [poi-plugin-tabex](https://github.com/momocow/poi-plugin-tabex)
30
+
31
+ ## License
32
+
33
+ MIT
@@ -1 +1 @@
1
- a89f6893478705a9b710472ffeafb5a45122b9ce
1
+ 004638c4fa18cf4d37e45f3a8704bffe7cdaa49e
@@ -4,4 +4,4 @@ export const KcwikiQuestData = {
4
4
  'zh-CN': zh_CN,
5
5
  }
6
6
 
7
- export const version = 'a89f6893478705a9b710472ffeafb5a45122b9ce'
7
+ export const version = '004638c4fa18cf4d37e45f3a8704bffe7cdaa49e'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poi-plugin-quest-info-2",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "private": false,
5
5
  "description": "show quest info",
6
6
  "homepage": "https://github.com/lawvs/poi-plugin-quest-2/",
package/src/Toolbar.tsx CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  CATEGORY_TAGS,
13
13
  ALL_TAGS,
14
14
  } from './tags'
15
- import type { KcanotifyQuestExt } from './questHelper'
15
+ import type { UnionQuest } from './questHelper'
16
16
  import { usePluginTranslation } from './poi/hooks'
17
17
  import { IN_POI } from './poi/env'
18
18
 
@@ -158,10 +158,10 @@ const useToolbarFilter = () => {
158
158
  .map((i) => i.toUpperCase())
159
159
 
160
160
  const stringFilter = useCallback(
161
- (quest: KcanotifyQuestExt) => {
162
- const text = `${quest.code} ${quest.name} ${quest.desc} ${
163
- quest.memo ?? ''
164
- }`
161
+ (quest: UnionQuest) => {
162
+ const text = `${quest.docQuest.code} ${quest.docQuest.name} ${
163
+ quest.docQuest.desc
164
+ } ${quest.docQuest.memo ?? ''}`
165
165
  if (!searchKeywords) {
166
166
  return true
167
167
  }
@@ -173,7 +173,7 @@ const useToolbarFilter = () => {
173
173
  )
174
174
 
175
175
  const toolbarFilter = useCallback(
176
- (quest: KcanotifyQuestExt) => {
176
+ (quest: UnionQuest) => {
177
177
  return [...tagsFilter, stringFilter].every((filter) => filter(quest))
178
178
  },
179
179
  [stringFilter, tagsFilter]
@@ -2,7 +2,7 @@ import { version, KcwikiQuestData } from '../../build/kcQuestsData'
2
2
 
3
3
  test('should KcwikiQuestData Game data version correct', () => {
4
4
  expect(version).toMatchInlineSnapshot(
5
- `"a89f6893478705a9b710472ffeafb5a45122b9ce"`
5
+ `"004638c4fa18cf4d37e45f3a8704bffe7cdaa49e"`
6
6
  )
7
7
  })
8
8
 
@@ -75,7 +75,7 @@ const questIconMap = {
75
75
  } as const
76
76
 
77
77
  const questStatusMap: Record<QUEST_STATUS, React.FC> = {
78
- [QUEST_STATUS.Locked]: function Locked() {
78
+ [QUEST_STATUS.LOCKED]: function Locked() {
79
79
  const { t } = usePluginTranslation()
80
80
  return (
81
81
  <Tooltip content={t('Locked')}>
@@ -84,8 +84,8 @@ const questStatusMap: Record<QUEST_STATUS, React.FC> = {
84
84
  )
85
85
  },
86
86
  // Display nothing
87
- [QUEST_STATUS.Default]: () => null,
88
- [QUEST_STATUS.InProgress]: function InProgress() {
87
+ [QUEST_STATUS.DEFAULT]: () => null,
88
+ [QUEST_STATUS.IN_PROGRESS]: function InProgress() {
89
89
  const { t } = usePluginTranslation()
90
90
  return (
91
91
  <Tooltip content={t('In Progress')}>
@@ -93,7 +93,7 @@ const questStatusMap: Record<QUEST_STATUS, React.FC> = {
93
93
  </Tooltip>
94
94
  )
95
95
  },
96
- [QUEST_STATUS.Completed]: function Completed() {
96
+ [QUEST_STATUS.COMPLETED]: function Completed() {
97
97
  const { t } = usePluginTranslation()
98
98
  return (
99
99
  <Tooltip content={t('Completed')}>
@@ -101,7 +101,7 @@ const questStatusMap: Record<QUEST_STATUS, React.FC> = {
101
101
  </Tooltip>
102
102
  )
103
103
  },
104
- [QUEST_STATUS.AlreadyCompleted]: function AlreadyCompleted() {
104
+ [QUEST_STATUS.ALREADY_COMPLETED]: function AlreadyCompleted() {
105
105
  const { t } = usePluginTranslation()
106
106
  return (
107
107
  <Tooltip content={t('Already Completed')}>
@@ -126,7 +126,7 @@ export const LargeQuestCard: React.FC<QuestCardProps> = ({
126
126
  name,
127
127
  desc,
128
128
  tips,
129
- status = QUEST_STATUS.Default,
129
+ status = QUEST_STATUS.DEFAULT,
130
130
  onClick,
131
131
  style,
132
132
  }) => {
@@ -159,7 +159,7 @@ export const MinimalQuestCard: React.FC<QuestCardProps> = ({
159
159
  name,
160
160
  desc,
161
161
  tips,
162
- status = QUEST_STATUS.Default,
162
+ status = QUEST_STATUS.DEFAULT,
163
163
  onClick,
164
164
  style,
165
165
  }) => {
@@ -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 = [