2024-08-02 10:31:25 +00:00
|
|
|
import { CurrentUserMark, Mark } from '../types/mark.ts'
|
|
|
|
import { hexToNpub } from './nostr.ts'
|
|
|
|
import { Meta, SignedEventContent } from '../types'
|
|
|
|
import { Event } from 'nostr-tools'
|
2024-08-11 19:19:26 +00:00
|
|
|
import { EMPTY } from './const.ts'
|
2024-08-02 10:31:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Takes in an array of Marks already filtered by User.
|
|
|
|
* Returns an array of CurrentUserMarks with correct values mix-and-matched.
|
|
|
|
* @param marks - default Marks extracted from Meta
|
|
|
|
* @param signedMetaMarks - signed user Marks extracted from DocSignatures
|
|
|
|
*/
|
2024-08-11 19:19:26 +00:00
|
|
|
const getCurrentUserMarks = (
|
|
|
|
marks: Mark[],
|
|
|
|
signedMetaMarks: Mark[]
|
|
|
|
): CurrentUserMark[] => {
|
2024-08-02 10:31:25 +00:00
|
|
|
return marks.map((mark, index, arr) => {
|
2024-08-11 19:19:26 +00:00
|
|
|
const signedMark = signedMetaMarks.find((m) => m.id === mark.id)
|
2024-08-02 10:31:25 +00:00
|
|
|
return {
|
|
|
|
mark,
|
2024-08-11 19:19:26 +00:00
|
|
|
currentValue: signedMark?.value ?? EMPTY,
|
|
|
|
id: index + 1,
|
2024-08-02 10:31:25 +00:00
|
|
|
isLast: isLast(index, arr),
|
2024-08-11 19:19:26 +00:00
|
|
|
isCompleted: !!signedMark?.value
|
2024-08-02 10:31:25 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns next incomplete CurrentUserMark if there is one
|
|
|
|
* @param usersMarks
|
|
|
|
*/
|
2024-08-11 19:19:26 +00:00
|
|
|
const findNextIncompleteCurrentUserMark = (
|
|
|
|
usersMarks: CurrentUserMark[]
|
|
|
|
): CurrentUserMark | undefined => {
|
|
|
|
return usersMarks.find((mark) => !mark.isCompleted)
|
2024-08-02 10:31:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns Marks that are assigned to a specific user
|
|
|
|
* @param marks
|
|
|
|
* @param pubkey
|
|
|
|
*/
|
|
|
|
const filterMarksByPubkey = (marks: Mark[], pubkey: string): Mark[] => {
|
2024-08-11 19:19:26 +00:00
|
|
|
return marks.filter((mark) => mark.npub === hexToNpub(pubkey))
|
2024-08-02 10:31:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Takes Signed Doc Signatures part of Meta and extracts
|
|
|
|
* all Marks into one flar array, regardless of the user.
|
|
|
|
* @param meta
|
|
|
|
*/
|
|
|
|
const extractMarksFromSignedMeta = (meta: Meta): Mark[] => {
|
|
|
|
return Object.values(meta.docSignatures)
|
|
|
|
.map((val: string) => JSON.parse(val as string))
|
|
|
|
.map((val: Event) => JSON.parse(val.content))
|
|
|
|
.flatMap((val: SignedEventContent) => val.marks)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks the CurrentUserMarks array that every element in that array has been
|
|
|
|
* marked as complete.
|
|
|
|
* @param currentUserMarks
|
|
|
|
*/
|
2024-08-11 19:19:26 +00:00
|
|
|
const isCurrentUserMarksComplete = (
|
|
|
|
currentUserMarks: CurrentUserMark[]
|
|
|
|
): boolean => {
|
2024-08-02 10:31:25 +00:00
|
|
|
return currentUserMarks.every((mark) => mark.isCompleted)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts an updated mark into an existing array of marks. Returns a copy of the
|
|
|
|
* existing array with a new value inserted
|
|
|
|
* @param marks
|
|
|
|
* @param markToUpdate
|
|
|
|
*/
|
|
|
|
const updateMarks = (marks: Mark[], markToUpdate: Mark): Mark[] => {
|
2024-08-11 19:19:26 +00:00
|
|
|
const indexToUpdate = marks.findIndex((mark) => mark.id === markToUpdate.id)
|
2024-08-02 10:31:25 +00:00
|
|
|
return [
|
|
|
|
...marks.slice(0, indexToUpdate),
|
|
|
|
markToUpdate,
|
|
|
|
...marks.slice(indexToUpdate + 1)
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2024-08-11 19:19:26 +00:00
|
|
|
const updateCurrentUserMarks = (
|
|
|
|
currentUserMarks: CurrentUserMark[],
|
|
|
|
markToUpdate: CurrentUserMark
|
|
|
|
): CurrentUserMark[] => {
|
|
|
|
const indexToUpdate = currentUserMarks.findIndex(
|
|
|
|
(m) => m.mark.id === markToUpdate.mark.id
|
|
|
|
)
|
2024-08-02 10:31:25 +00:00
|
|
|
return [
|
|
|
|
...currentUserMarks.slice(0, indexToUpdate),
|
|
|
|
markToUpdate,
|
|
|
|
...currentUserMarks.slice(indexToUpdate + 1)
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2024-08-11 19:19:26 +00:00
|
|
|
const isLast = <T>(index: number, arr: T[]) => index === arr.length - 1
|
|
|
|
|
|
|
|
const isCurrentValueLast = (
|
|
|
|
currentUserMarks: CurrentUserMark[],
|
|
|
|
selectedMark: CurrentUserMark,
|
|
|
|
selectedMarkValue: string
|
|
|
|
) => {
|
|
|
|
const filteredMarks = currentUserMarks.filter(
|
|
|
|
(mark) => mark.id !== selectedMark.id
|
|
|
|
)
|
|
|
|
return (
|
|
|
|
isCurrentUserMarksComplete(filteredMarks) && selectedMarkValue.length > 0
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
const getUpdatedMark = (
|
|
|
|
selectedMark: CurrentUserMark,
|
|
|
|
selectedMarkValue: string
|
|
|
|
): CurrentUserMark => {
|
|
|
|
return {
|
|
|
|
...selectedMark,
|
|
|
|
currentValue: selectedMarkValue,
|
2024-08-15 14:43:10 +00:00
|
|
|
isCompleted: !!selectedMarkValue,
|
|
|
|
mark: {
|
|
|
|
...selectedMark.mark,
|
|
|
|
value: selectedMarkValue
|
|
|
|
}
|
2024-08-11 19:19:26 +00:00
|
|
|
}
|
|
|
|
}
|
2024-08-02 10:31:25 +00:00
|
|
|
|
2024-08-20 14:04:27 +00:00
|
|
|
const findOtherUserMarks = (marks: Mark[], pubkey: string): Mark[] => {
|
|
|
|
return marks.filter((mark) => mark.npub !== hexToNpub(pubkey))
|
|
|
|
}
|
|
|
|
|
2024-08-02 10:31:25 +00:00
|
|
|
export {
|
|
|
|
getCurrentUserMarks,
|
|
|
|
filterMarksByPubkey,
|
|
|
|
extractMarksFromSignedMeta,
|
|
|
|
isCurrentUserMarksComplete,
|
2024-08-11 19:19:26 +00:00
|
|
|
findNextIncompleteCurrentUserMark,
|
2024-08-02 10:31:25 +00:00
|
|
|
updateMarks,
|
|
|
|
updateCurrentUserMarks,
|
2024-08-11 19:19:26 +00:00
|
|
|
isCurrentValueLast,
|
2024-08-20 14:04:27 +00:00
|
|
|
getUpdatedMark,
|
|
|
|
findOtherUserMarks
|
2024-08-02 10:31:25 +00:00
|
|
|
}
|