@magmamath/students-features 1.3.11 → 1.3.12-rc.0
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/dist/commonjs/features/pmProgress/components/chart/components/SlicesPaths.js +1 -1
- package/dist/commonjs/features/pmProgress/components/chart/components/SlicesPaths.js.map +1 -1
- package/dist/commonjs/features/pmProgress/components/header/NextUp.js +5 -9
- package/dist/commonjs/features/pmProgress/components/header/NextUp.js.map +1 -1
- package/dist/commonjs/features/pmProgress/components/insights/PmInsights.js +1 -1
- package/dist/commonjs/features/pmProgress/components/insights/PmInsights.js.map +1 -1
- package/dist/commonjs/features/pmProgress/components/list/PmDomainList.js +1 -1
- package/dist/commonjs/features/pmProgress/components/list/PmDomainList.js.map +1 -1
- package/dist/commonjs/features/pmProgress/components/standard/StandardTag.js +1 -1
- package/dist/commonjs/features/pmProgress/components/standard/StandardTag.js.map +1 -1
- package/dist/commonjs/features/pmProgress/hooks/useNextUpDomain.js +40 -0
- package/dist/commonjs/features/pmProgress/hooks/useNextUpDomain.js.map +1 -0
- package/dist/commonjs/features/pmProgress/model/PmTreeModel.js +32 -4
- package/dist/commonjs/features/pmProgress/model/PmTreeModel.js.map +1 -1
- package/dist/commonjs/features/pmProgress/shared/pmProgress.helpers.js +6 -2
- package/dist/commonjs/features/pmProgress/shared/pmProgress.helpers.js.map +1 -1
- package/dist/module/features/pmProgress/components/chart/components/SlicesPaths.js +1 -1
- package/dist/module/features/pmProgress/components/chart/components/SlicesPaths.js.map +1 -1
- package/dist/module/features/pmProgress/components/header/NextUp.js +6 -10
- package/dist/module/features/pmProgress/components/header/NextUp.js.map +1 -1
- package/dist/module/features/pmProgress/components/insights/PmInsights.js +1 -1
- package/dist/module/features/pmProgress/components/insights/PmInsights.js.map +1 -1
- package/dist/module/features/pmProgress/components/list/PmDomainList.js +1 -1
- package/dist/module/features/pmProgress/components/list/PmDomainList.js.map +1 -1
- package/dist/module/features/pmProgress/components/standard/StandardTag.js +1 -1
- package/dist/module/features/pmProgress/components/standard/StandardTag.js.map +1 -1
- package/dist/module/features/pmProgress/hooks/useNextUpDomain.js +35 -0
- package/dist/module/features/pmProgress/hooks/useNextUpDomain.js.map +1 -0
- package/dist/module/features/pmProgress/model/PmTreeModel.js +33 -5
- package/dist/module/features/pmProgress/model/PmTreeModel.js.map +1 -1
- package/dist/module/features/pmProgress/shared/pmProgress.helpers.js +2 -0
- package/dist/module/features/pmProgress/shared/pmProgress.helpers.js.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/components/header/NextUp.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/hooks/useNextUpDomain.d.ts +5 -0
- package/dist/typescript/commonjs/features/pmProgress/hooks/useNextUpDomain.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/pmProgress/model/PmTreeModel.d.ts +3 -2
- package/dist/typescript/commonjs/features/pmProgress/model/PmTreeModel.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/pmProgress/shared/pmProgress.helpers.d.ts +4 -0
- package/dist/typescript/commonjs/features/pmProgress/shared/pmProgress.helpers.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/components/header/NextUp.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/hooks/useNextUpDomain.d.ts +5 -0
- package/dist/typescript/module/features/pmProgress/hooks/useNextUpDomain.d.ts.map +1 -0
- package/dist/typescript/module/features/pmProgress/model/PmTreeModel.d.ts +3 -2
- package/dist/typescript/module/features/pmProgress/model/PmTreeModel.d.ts.map +1 -1
- package/dist/typescript/module/features/pmProgress/shared/pmProgress.helpers.d.ts +4 -0
- package/dist/typescript/module/features/pmProgress/shared/pmProgress.helpers.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/pmProgress/components/chart/components/SlicesPaths.tsx +1 -1
- package/src/features/pmProgress/components/header/NextUp.tsx +6 -13
- package/src/features/pmProgress/components/insights/PmInsights.tsx +1 -1
- package/src/features/pmProgress/components/list/PmDomainList.tsx +1 -1
- package/src/features/pmProgress/components/standard/StandardTag.tsx +1 -1
- package/src/features/pmProgress/hooks/useNextUpDomain.ts +29 -0
- package/src/features/pmProgress/model/PmTreeModel.ts +29 -4
- package/src/features/pmProgress/shared/pmProgress.helpers.ts +11 -0
|
@@ -4,33 +4,26 @@ import { COLORS, HeadingVariants, SPACING, Typography } from '@magmamath/react-n
|
|
|
4
4
|
import { SketchArrowRight } from '../../../../shared/icons/SketchArrowRight'
|
|
5
5
|
import { SliceDiamondIcon } from '../../../../shared/icons/SliceDiamondIcon'
|
|
6
6
|
import { useText } from '../../../../shared/translation'
|
|
7
|
-
import { useUnit
|
|
7
|
+
import { useUnit } from 'effector-react'
|
|
8
8
|
import { usePmProgress } from '../../context/PmProgressContext'
|
|
9
|
-
import { isFluencyDomain } from '../../shared/pmProgress.helpers'
|
|
10
9
|
import { OpeningLoaderId, SolvingFlow } from '../../shared/pmProgress.constants'
|
|
11
10
|
import { StartButton } from './StartButton'
|
|
11
|
+
import { useNextUpDomain } from '../../hooks/useNextUpDomain'
|
|
12
12
|
|
|
13
13
|
export const NextUp = () => {
|
|
14
14
|
const t = useText()
|
|
15
15
|
const { model, onStartPress } = usePmProgress()
|
|
16
|
+
const nextUp = useNextUpDomain()
|
|
16
17
|
|
|
17
18
|
const status = useUnit(model.tree.$status)
|
|
18
19
|
const loaderOpeningId = useUnit(model.solving.$loaderOpeningId)
|
|
19
20
|
|
|
20
|
-
const nextUp = useStoreMap(model.tree.$domains, (domains) =>
|
|
21
|
-
domains.find((domain) => {
|
|
22
|
-
const isFluency = isFluencyDomain(domain.title)
|
|
23
|
-
const isDomainCompleted = domain.standards.every((standard) => standard.isCompleted)
|
|
24
|
-
return !isFluency && !isDomainCompleted
|
|
25
|
-
}),
|
|
26
|
-
)
|
|
27
|
-
|
|
28
21
|
const isLoading = loaderOpeningId === OpeningLoaderId.START_BUTTON
|
|
29
22
|
const isSkillOpeningActionPending = !!(loaderOpeningId !== null || status)
|
|
30
23
|
|
|
31
24
|
return (
|
|
32
25
|
<View style={styles.container}>
|
|
33
|
-
{nextUp && !status && (
|
|
26
|
+
{nextUp.domain && !status && (
|
|
34
27
|
<>
|
|
35
28
|
<View style={styles.content}>
|
|
36
29
|
<View style={styles.subtitle}>
|
|
@@ -40,10 +33,10 @@ export const NextUp = () => {
|
|
|
40
33
|
</View>
|
|
41
34
|
<View style={[styles.row, styles.tilted]}>
|
|
42
35
|
<Typography variant={HeadingVariants.H7} style={styles.muted}>
|
|
43
|
-
{nextUp
|
|
36
|
+
{nextUp.domain.title}
|
|
44
37
|
</Typography>
|
|
45
38
|
<View style={styles.diamond}>
|
|
46
|
-
<SliceDiamondIcon color={nextUp
|
|
39
|
+
<SliceDiamondIcon color={nextUp.domain.color} />
|
|
47
40
|
</View>
|
|
48
41
|
</View>
|
|
49
42
|
</View>
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
export const PmInsights = () => {
|
|
16
16
|
const { model } = usePmProgress()
|
|
17
17
|
const [chartSize, setChartSize] = useState(MAX_PIE_CHART_SIZE)
|
|
18
|
-
const chartData = useStoreMap(model.tree.$
|
|
18
|
+
const chartData = useStoreMap(model.tree.$domainsInGrade, (domains) =>
|
|
19
19
|
domains.map((domain) => ({
|
|
20
20
|
value: 1,
|
|
21
21
|
fillPercent: Math.round(domain.scorePercentage),
|
|
@@ -11,7 +11,7 @@ import { SolvingFlow } from '../../shared/pmProgress.constants'
|
|
|
11
11
|
|
|
12
12
|
export const PmDomainList = () => {
|
|
13
13
|
const { model, onStandardPress } = usePmProgress()
|
|
14
|
-
const domains = useUnit(model.tree.$
|
|
14
|
+
const domains = useUnit(model.tree.$domainsInGrade)
|
|
15
15
|
const expandedId = useUnit(model.highlight.$expandedId)
|
|
16
16
|
const hoveredId = useUnit(model.highlight.$hoveredId)
|
|
17
17
|
const loaderOpeningId = useUnit(model.solving.$loaderOpeningId)
|
|
@@ -118,7 +118,7 @@ type StandardTagProps = {
|
|
|
118
118
|
|
|
119
119
|
export const StandardTag = ({ skillId, model }: StandardTagProps) => {
|
|
120
120
|
const standardInfo = useStoreMap({
|
|
121
|
-
store: model.tree.$
|
|
121
|
+
store: model.tree.$domainsInGrade,
|
|
122
122
|
keys: [skillId],
|
|
123
123
|
fn: (domains, [skillId]) => {
|
|
124
124
|
const domain = domains.find((d) => d.standards.some((s) => s.skillIds.includes(skillId)))
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useUnit, useStoreMap } from 'effector-react'
|
|
2
|
+
import { usePmProgress } from '../context/PmProgressContext'
|
|
3
|
+
import { findDomainBySkillId, isFluencyDomain } from '../shared/pmProgress.helpers'
|
|
4
|
+
|
|
5
|
+
export const useNextUpDomain = () => {
|
|
6
|
+
const { model } = usePmProgress()
|
|
7
|
+
const magmaRecs = useUnit(model.recommendations.$magma)
|
|
8
|
+
|
|
9
|
+
return useStoreMap({
|
|
10
|
+
store: model.tree.$domainsInTree,
|
|
11
|
+
keys: [magmaRecs],
|
|
12
|
+
fn: (domains) => {
|
|
13
|
+
const firstRec = magmaRecs.items[0]
|
|
14
|
+
if (firstRec) {
|
|
15
|
+
const domain = findDomainBySkillId(firstRec._id, domains) ?? null
|
|
16
|
+
return { domain, isFromRecommendation: true }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const domain =
|
|
20
|
+
domains.find((domain) => {
|
|
21
|
+
const isFluency = isFluencyDomain(domain.title)
|
|
22
|
+
const isDomainCompleted = domain.standards.every((standard) => standard.isCompleted)
|
|
23
|
+
return !isFluency && !isDomainCompleted
|
|
24
|
+
}) ?? null
|
|
25
|
+
|
|
26
|
+
return { domain, isFromRecommendation: false }
|
|
27
|
+
},
|
|
28
|
+
})
|
|
29
|
+
}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
getInitialPmGrade,
|
|
19
19
|
getTreeGrades,
|
|
20
20
|
isTreeDataReady,
|
|
21
|
+
isTreeDataWithoutGradeReady,
|
|
21
22
|
} from '../shared/pmProgress.helpers'
|
|
22
23
|
import { TreeNormalizer } from '../shared/TreeNormalizer'
|
|
23
24
|
import { persist } from 'effector-storage/session'
|
|
@@ -30,25 +31,26 @@ export class PmTreeModel {
|
|
|
30
31
|
private readonly $user = createStore<User | null>(null)
|
|
31
32
|
|
|
32
33
|
private readonly setupInitialGrade = createEvent<SetupInitialGradeProps>()
|
|
33
|
-
private readonly setDomains = createEvent<Domain[]>()
|
|
34
34
|
public readonly setGrade = createEvent<number | null>()
|
|
35
35
|
|
|
36
36
|
public readonly $isInitialized = createStore(false)
|
|
37
37
|
public readonly $grade = restore(this.setGrade, null)
|
|
38
|
-
public readonly $
|
|
38
|
+
public readonly $domainsInGrade = createStore<Domain[]>([])
|
|
39
|
+
public readonly $domainsInTree = createStore<Domain[]>([])
|
|
39
40
|
public readonly $grades = createStore<Grade[]>([])
|
|
40
41
|
public readonly $status = createStore<PmProgressStatus | null>(null)
|
|
41
42
|
|
|
42
43
|
constructor(private readonly api: PmProgressApi) {
|
|
43
44
|
if (isWeb) {
|
|
44
45
|
persist({ key: SessionStorageKeys.GRADE, store: this.$grade })
|
|
45
|
-
persist({ key: SessionStorageKeys.DOMAINS, store: this.$
|
|
46
|
+
persist({ key: SessionStorageKeys.DOMAINS, store: this.$domainsInGrade })
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
this.setupFailedAndLockedStatus()
|
|
49
50
|
this.setupTreeInit()
|
|
50
51
|
this.setupGradeInit()
|
|
51
52
|
this.setupDomainStructure()
|
|
53
|
+
this.setupDomainsInTree()
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
public readonly initTreeFx = createEffect(async ({ user }: PmProgressGateProps) => {
|
|
@@ -165,7 +167,30 @@ export class PmTreeModel {
|
|
|
165
167
|
|
|
166
168
|
return getDomainStructure(treeWithUserStats, tree.treeMapping)
|
|
167
169
|
},
|
|
168
|
-
target: this
|
|
170
|
+
target: this.$domainsInGrade,
|
|
171
|
+
})
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private setupDomainsInTree() {
|
|
175
|
+
sample({
|
|
176
|
+
clock: this.initTreeFx.doneData,
|
|
177
|
+
source: { tree: this.$tree, stats: this.$stats, user: this.$user },
|
|
178
|
+
filter: isTreeDataWithoutGradeReady,
|
|
179
|
+
fn: ({ tree, stats, user }) => {
|
|
180
|
+
const treeNodes = Object.values(tree.treeMapping)
|
|
181
|
+
const grades = getTreeGrades(tree, user).filter((g) => !g.isLocked)
|
|
182
|
+
|
|
183
|
+
return grades.flatMap((grade) => {
|
|
184
|
+
const [treeWithStats] = enhanceProgressMatrixData(
|
|
185
|
+
treeNodes,
|
|
186
|
+
stats,
|
|
187
|
+
[{ entityId: user._id, name: user.fullName }],
|
|
188
|
+
grade.value,
|
|
189
|
+
)
|
|
190
|
+
return getDomainStructure(treeWithStats, tree.treeMapping)
|
|
191
|
+
})
|
|
192
|
+
},
|
|
193
|
+
target: this.$domainsInTree,
|
|
169
194
|
})
|
|
170
195
|
}
|
|
171
196
|
}
|
|
@@ -171,6 +171,14 @@ type TreeDataReady = {
|
|
|
171
171
|
export const isTreeDataReady = (source: TreeDataSource): source is TreeDataReady =>
|
|
172
172
|
source.tree !== null && source.stats !== null && source.user !== null && source.grade !== null
|
|
173
173
|
|
|
174
|
+
type TreeDataWithoutGrade = Omit<TreeDataSource, 'grade'>
|
|
175
|
+
type TreeDataWithoutGradeReady = Omit<TreeDataReady, 'grade'>
|
|
176
|
+
|
|
177
|
+
export const isTreeDataWithoutGradeReady = (
|
|
178
|
+
source: TreeDataWithoutGrade,
|
|
179
|
+
): source is TreeDataWithoutGradeReady =>
|
|
180
|
+
source.tree !== null && source.stats !== null && source.user !== null
|
|
181
|
+
|
|
174
182
|
export const createChartConfig = (size: number): PieChartManagerConfig => {
|
|
175
183
|
const OUTER_MARGIN = 5
|
|
176
184
|
return {
|
|
@@ -261,6 +269,9 @@ export const withoutDuplicates = (skills: (Skill | undefined)[]): Skill[] => {
|
|
|
261
269
|
})
|
|
262
270
|
}
|
|
263
271
|
|
|
272
|
+
export const findDomainBySkillId = (skillId: string, domains: Domain[]): Domain | undefined =>
|
|
273
|
+
domains.find((d) => d.standards.some((s) => s.skillIds.includes(skillId)))
|
|
274
|
+
|
|
264
275
|
// Reorders grades starting from the given grade, wrapping around. [1,2,3] with start=2 → [2,3,1]
|
|
265
276
|
export const startGradesFrom = (grades: Grade[], startGrade: number): Grade[] => {
|
|
266
277
|
const index = grades.findIndex(({ value }) => value === startGrade)
|