-
-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathTestCaseProvider.tsx
More file actions
79 lines (70 loc) · 1.57 KB
/
TestCaseProvider.tsx
File metadata and controls
79 lines (70 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
'use client'
import { createContext, useContext, useState } from 'react'
import { TestStatusMap } from '@/types'
export type TestCaseFilter =
| 'korean'
| 'math'
| 'science'
| 'music'
| 'western'
| 'foreign-language'
| 'ipa'
| 'corpus'
export type TestCaseOptions = {
filters: TestCaseFilter[]
failedOnly: boolean
type: 'list' | 'table'
}
export type FilterMap = Record<TestCaseFilter, string[]>
const TestCaseContext = createContext<{
testStatusMap: TestStatusMap
filterMap: FilterMap
options: TestCaseOptions
onChangeOptions: (options: Partial<TestCaseOptions>) => void
} | null>(null)
export function useTestCase() {
const context = useContext(TestCaseContext)
if (!context) {
throw new Error('useTestCase must be used within a TestCaseProvider')
}
return context
}
export function TestCaseProvider({
testStatusMap,
filterMap,
children,
}: {
testStatusMap: TestStatusMap
filterMap: FilterMap
children: React.ReactNode
}) {
const [options, setOptions] = useState<TestCaseOptions>({
filters: [
'korean',
'math',
'science',
'music',
'western',
'foreign-language',
'ipa',
'corpus',
],
failedOnly: false,
type: 'list',
})
const handleChangeOptions = (options: Partial<TestCaseOptions>) => {
setOptions((prev) => ({ ...prev, ...options }))
}
return (
<TestCaseContext.Provider
value={{
filterMap,
onChangeOptions: handleChangeOptions,
options,
testStatusMap,
}}
>
{children}
</TestCaseContext.Provider>
)
}