Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 16 additions & 24 deletions apps/desktop/src/components/main/body/templates/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import {
import {
type ComponentRef,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { createQueries } from "tinybase/with-schemas";

import type { Template, TemplateSection, TemplateStorage } from "@hypr/store";
import { Button } from "@hypr/ui/components/ui/button";
Expand Down Expand Up @@ -100,32 +100,24 @@ export type UserTemplate = Template & { id: string };

export function useUserTemplates(): UserTemplate[] {
const { user_id } = main.UI.useValues(main.STORE_ID);
const store = main.UI.useStore(main.STORE_ID);

const USER_TEMPLATE_QUERY = "user_templates";

const queries = main.UI.useCreateQueries(
store,
(store) =>
createQueries(store).setQueryDefinition(
USER_TEMPLATE_QUERY,
"templates",
({ select, where }) => {
select("title");
select("description");
select("sections");
select("user_id");
where("user_id", user_id ?? "");
},
),
[user_id],
);
const queries = main.UI.useQueries(main.STORE_ID);

useEffect(() => {
queries?.setParamValue(
main.QUERIES.userTemplates,
"user_id",
user_id ?? "",
);
}, [queries, user_id]);

const templates = main.UI.useResultTable(USER_TEMPLATE_QUERY, queries);
const templates = main.UI.useResultTable(
main.QUERIES.userTemplates,
main.STORE_ID,
);

return useMemo(() => {
return Object.entries(templates as Record<string, unknown>).map(
([id, template]) => normalizeTemplateWithId(id, template),
return Object.entries(templates).map(([id, template]) =>
normalizeTemplateWithId(id, template as unknown),
);
}, [templates]);
}
Expand Down
105 changes: 101 additions & 4 deletions apps/desktop/src/store/tinybase/store/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const {
useProvideCheckpoints,
} = _UI as _UI.WithSchemas<Schemas>;

export const UI = _UI as _UI.WithSchemas<Schemas>;
export const UI = _UI as TypedUI;
export type Store = MergeableStore<Schemas>;
export type { Schemas };

Expand Down Expand Up @@ -192,6 +192,18 @@ export const StoreComponent = () => {
getCell("enabled") === true && getCell("provider") === "apple",
);
},
)
.setQueryDefinition(
QUERIES.userTemplates,
"templates",
({ select, where, param }) => {
select("title");
select("description");
select("sections");
select("user_id");
where("user_id", (param("user_id") as string) ?? "");
},
{ user_id: "" },
),
[],
)!;
Expand Down Expand Up @@ -335,12 +347,13 @@ export const QUERIES = {
sessionParticipantsWithDetails: "sessionParticipantsWithDetails",
sessionRecordingTimes: "sessionRecordingTimes",
enabledAppleCalendars: "enabledAppleCalendars",
};
userTemplates: "userTemplates",
} as const;

export const METRICS = {
totalHumans: "totalHumans",
totalOrganizations: "totalOrganizations",
};
} as const;

export const INDEXES = {
humansByOrg: "humansByOrg",
Expand All @@ -356,9 +369,93 @@ export const INDEXES = {
sessionsByHuman: "sessionsByHuman",
enhancedNotesBySession: "enhancedNotesBySession",
enhancedNotesByTemplate: "enhancedNotesByTemplate",
};
} as const;

export const RELATIONSHIPS = {
sessionToEvent: "sessionToEvent",
enhancedNoteToSession: "enhancedNoteToSession",
} as const;

type QueryId = (typeof QUERIES)[keyof typeof QUERIES];

interface _QueryResultRows {
timelineEvents: {
title: string;
started_at: string;
ended_at: string;
calendar_id: string;
recurrence_series_id: string;
};
timelineSessions: {
title: string;
created_at: string;
event_id: string;
folder_id: string;
event_started_at?: string;
};
visibleHumans: {
name: string;
email: string;
org_id: string;
job_title: string;
linkedin_username: string;
pinned: boolean;
pin_order: number;
};
visibleOrganizations: {
name: string;
};
visibleTemplates: {
title: string;
description: string;
sections: string;
};
visibleChatShortcuts: {
user_id: string;
title: string;
content: string;
};
sessionParticipantsWithDetails: {
session_id: string;
human_id: string;
human_name?: string;
human_email?: string;
human_job_title?: string;
human_linkedin_username?: string;
org_id?: string;
org_name?: string;
};
sessionRecordingTimes: {
session_id: string;
min_started_at: number;
max_ended_at: number;
};
enabledAppleCalendars: {
provider: string;
};
userTemplates: {
title: string;
description: string;
sections: string;
user_id: string;
};
}

export type QueryResultRowMap = { [K in QueryId]: _QueryResultRows[K] };

type QueriesOrQueriesId = _UI.WithSchemas<Schemas>["QueriesOrQueriesId"];

type TypedUI = Omit<
_UI.WithSchemas<Schemas>,
"useResultTable" | "useResultRow"
> & {
useResultTable: <Q extends QueryId>(
queryId: Q,
queriesOrQueriesId?: QueriesOrQueriesId,
) => Record<string, QueryResultRowMap[Q]>;
useResultRow: <Q extends QueryId>(
queryId: Q,
rowId: string,
queriesOrQueriesId?: QueriesOrQueriesId,
) => QueryResultRowMap[Q];
};
Loading