mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
* feat: keyboard nav * fix: link update * feat: reusable learning state * chore: use new learning state * feat: add to my profile * . * . * feat: on enter open the link * fix: lint * fix: use eslint v8 instead of v9 * fix: add to my profile * chore: update personal link schema * chore: update personal page schema * fix: update detail wrapper * fix: update page section * removing option for learning status * removing option for learning status for topic * feat: add createdAt and updatedAt for personal Page * chore: update page section component * chore: remove chevron from sub menu * fix: sidebar * chore: add focus and disable toast * feat: la editor add execption for no command class * fix: la editor style and fix page detail * fix: title * fix: topic learning state * chore: add showSearch for learning state * fix: bunch stuff * chore: link list and item handle learning state * chore: set expand to false * feat: personal link for topic detail * chore: hook use topic data * chore: go to list * fix: link and topic * feat(utils): new keyboard utils * feat(store): add linkOpenPopoverForIdAtom for link * chore: using memo for use topic data * fix: remove duplicate component * chore: performance for topic detail lint item * refactor: remove LinkOptions component * chore: improve performance for list * feat: added LinkRoute copmonent * chore: link manage * feat: bottom bar * fix: link * fix: page wrapper * fix: import thing * chore: added a displayname * refactor: page detail * refactor: page detail * fix: add topic to personal link form link * fix: only show page count if more than zero * fix: sidebar topic section --------- Co-authored-by: Nikita <github@nikiv.dev> Co-authored-by: marshennikovaolga <marshennikova@gmail.com>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import { co, CoList, CoMap, Encoders, ID } from "jazz-tools"
|
|
import { Link, Topic } from "./master/topic"
|
|
|
|
class BaseModel extends CoMap {
|
|
createdAt = co.encoded(Encoders.Date)
|
|
updatedAt = co.encoded(Encoders.Date)
|
|
}
|
|
|
|
export class PersonalLink extends BaseModel {
|
|
url = co.string
|
|
icon = co.optional.string // is an icon URL
|
|
link = co.optional.ref(Link)
|
|
title = co.string
|
|
slug = co.string
|
|
description = co.optional.string
|
|
completed = co.boolean
|
|
sequence = co.number
|
|
learningState = co.optional.literal("wantToLearn", "learning", "learned")
|
|
notes = co.optional.string
|
|
summary = co.optional.string
|
|
topic = co.optional.ref(Topic)
|
|
}
|
|
|
|
export class PersonalLinkLists extends CoList.Of(co.ref(PersonalLink)) {}
|
|
|
|
export function updatePersonalLink(link: PersonalLink, data: Partial<PersonalLink>): void {
|
|
Object.assign(link, { ...data, updatedAt: new Date() })
|
|
}
|
|
|
|
export function createPersonalLinkList(owner: { group: any }): PersonalLinkLists {
|
|
return PersonalLinkLists.create([], { owner: owner.group })
|
|
}
|
|
|
|
export function addToPersonalLinkList(list: PersonalLinkLists, item: PersonalLink): void {
|
|
list.push(item)
|
|
}
|
|
|
|
export function removeFromPersonalLinkList(list: PersonalLinkLists, id: ID<PersonalLink>): void {
|
|
const index = list.findIndex(item => item?.id === id)
|
|
if (index !== -1) {
|
|
list.splice(index, 1)
|
|
}
|
|
}
|
|
|
|
export function updateInPersonalLinkList(
|
|
list: PersonalLinkLists,
|
|
id: ID<PersonalLink>,
|
|
data: Partial<PersonalLink>
|
|
): void {
|
|
const item = list.find(item => item?.id === id)
|
|
if (item) {
|
|
Object.assign(item, { ...data, updatedAt: new Date() })
|
|
}
|
|
}
|
|
|
|
export function getFromPersonalLinkList(
|
|
list: PersonalLinkLists,
|
|
id: ID<PersonalLink>
|
|
): PersonalLink | null | undefined {
|
|
return list.find(item => item?.id === id)
|
|
}
|
|
|
|
export function safelyAccessPersonalLink<T>(
|
|
link: PersonalLink | null | undefined,
|
|
accessor: (link: PersonalLink) => T,
|
|
defaultValue: T
|
|
): T {
|
|
return link ? accessor(link) : defaultValue
|
|
}
|