mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
* wip * wip * wip3 * chore: utils * feat: add command * wip * fix: key duplicate * fix: move and check * fix: use react-use instead * fix: sidebar * chore: make dynamic * chore: tablet mode * chore: fix padding * chore: link instead of inbox * fix: use dnd kit * feat: add select component * chore: use atom * refactor: remove dnd provider * feat: disabled drag when sort is not manual * search route * . * feat: accessibility * fix: search * . * . * . * fix: sidebar collapsed * ai search layout * . * . * . * . * ai responsible content * . * . * . * . * . * global topic route * global topic correct route * topic buttons * sidebar search navigation * ai * Update jazz * . * . * . * . * . * learning status * . * . * chore: content header * fix: pointer none when dragging. prevent auto click after drag end * fix: confirm * fix: prevent drag when editing * chore: remove unused fn * fix: check propagation * chore: list * chore: tweak sonner * chore: update stuff * feat: add badge * chore: close edit when create * chore: escape on manage form * refactor: remove learn path * css: responsive item * chore: separate pages and topic * reafactor: remove new-schema * feat(types): extend jazz type so it can be nullable * chore: use new types * fix: missing deps * fix: link * fix: sidebar in layout * fix: quotes * css: use medium instead semi * Actual streaming and rendering markdown response * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * chore: metadata * feat: la-editor * . * fix: editor and page * . * . * . * . * . * . * fix: remove link * chore: page sidebar * fix: remove 'replace with learning status' * fix: link * fix: link * chore: update schema * chore: use new schema * fix: instead of showing error, just do unique slug * feat: create slug * refactor apply * update package json * fix: schema personal page * chore: editor * feat: pages * fix: metadata * fix: jazz provider * feat: handling data * feat: page detail * chore: server page to id * chore: use id instead of slug * chore: update content header * chore: update link header implementation * refactor: global.css * fix: la editor use animation frame * fix: editor export ref * refactor: page detail * chore: tidy up schema * chore: adapt to new schema * fix: wrap using settimeout * fix: wrap using settimeout * . * . --------- Co-authored-by: marshennikovaolga <marshennikova@gmail.com> Co-authored-by: Nikita <github@nikiv.dev> Co-authored-by: Anselm <anselm.eickhoff@gmail.com> Co-authored-by: Damian Tarnawski <gthetarnav@gmail.com>
73 lines
3.0 KiB
TypeScript
73 lines
3.0 KiB
TypeScript
// Jazz schema for LA
|
||
// if field does not have `co.optional` it is required
|
||
// rule: list all required fields first, then optional fields
|
||
// rule: any field that is generated by AI, should be prefixed with `ai`, e.g. `aiSummary`
|
||
// TODO: move more fields from old edgedb schema to jazz (where it makes sense): https://github.com/learn-anything/explore/blob/main/archive/api/edgedb/dbschema/default-latest.esdl
|
||
// TODO: all instances of (unique) should be enforced by jazz itself, it means that only one instance with that name of field can exist
|
||
// sadly jazz does not allow enforcing that, so solutions for (unique) fields is: ignore duplicates or create a supporting look up structure (CoMap.Record from url to GlobalLink) and then I’ll let you know once the better way exists
|
||
// open issue about it: https://github.com/gardencmp/jazz/issues/44
|
||
// TODO: figure out how to do default values, e.g. `GlobalLink.protocol` should have default value `https` so we don't have to supply it every time in code..
|
||
// TODO: can jazz support vector fields? e.g. `GlobalLinkAiSummary.vectorContent`, would be nice to store website content as vector for semantic search
|
||
import { CoMap, co, Account, Group } from "jazz-tools"
|
||
import { PersonalPageLists } from "./personal-page"
|
||
import { PersonalLinkLists } from "./personal-link"
|
||
import { GlobalTopicLists } from "./global-topic"
|
||
|
||
class UserProfile extends CoMap {
|
||
name = co.string
|
||
// TODO: avatar
|
||
}
|
||
export class UserRoot extends CoMap {
|
||
name = co.string
|
||
username = co.string
|
||
website = co.string
|
||
bio = co.string
|
||
|
||
personalLinks = co.ref(PersonalLinkLists)
|
||
personalPages = co.ref(PersonalPageLists)
|
||
|
||
// not implemented yet
|
||
topicsWantToLearn = co.ref(GlobalTopicLists)
|
||
topicsLearning = co.ref(GlobalTopicLists)
|
||
topicsLearned = co.ref(GlobalTopicLists)
|
||
}
|
||
|
||
export class LaAccount extends Account {
|
||
profile = co.ref(UserProfile)
|
||
root = co.ref(UserRoot)
|
||
async migrate(
|
||
this: LaAccount,
|
||
creationProps?: { name: string; username: string; website: string; bio: string } | undefined
|
||
): Promise<void> {
|
||
if (!this._refs.root && creationProps) {
|
||
const profileGroup = Group.create({ owner: this })
|
||
profileGroup.addMember("everyone", "reader")
|
||
this.profile = UserProfile.create({ name: creationProps.name }, { owner: profileGroup })
|
||
this.root = UserRoot.create(
|
||
{
|
||
name: creationProps.name,
|
||
username: creationProps.username,
|
||
website: creationProps.website,
|
||
bio: creationProps.bio,
|
||
|
||
personalLinks: PersonalLinkLists.create([], { owner: this }),
|
||
personalPages: PersonalPageLists.create([], { owner: this }),
|
||
|
||
// not implemented yet
|
||
topicsWantToLearn: GlobalTopicLists.create([], { owner: this }),
|
||
topicsLearning: GlobalTopicLists.create([], { owner: this }),
|
||
topicsLearned: GlobalTopicLists.create([], { owner: this })
|
||
},
|
||
{ owner: this }
|
||
)
|
||
}
|
||
}
|
||
}
|
||
// TODO: need?
|
||
// class ListOfGlobalTopics extends CoList.Of(co.ref(GlobalTopic)) {}
|
||
|
||
export * from "./global-link"
|
||
export * from "./global-topic"
|
||
export * from "./personal-link"
|
||
export * from "./personal-page"
|