From 0c00144150483907ff39f5b6b4c2fb023e87decc Mon Sep 17 00:00:00 2001 From: Nik Graf Date: Mon, 23 Jun 2025 21:48:43 +0200 Subject: [PATCH] disable merged mode --- apps/events/src/components/todos2.tsx | 39 ++--- .../src/components/users/users-merged.tsx | 2 +- packages/hypergraph-react/src/use-query.tsx | 141 +++++++++--------- 3 files changed, 89 insertions(+), 93 deletions(-) diff --git a/apps/events/src/components/todos2.tsx b/apps/events/src/components/todos2.tsx index 832edbe1..98ac882a 100644 --- a/apps/events/src/components/todos2.tsx +++ b/apps/events/src/components/todos2.tsx @@ -26,14 +26,14 @@ export const Todos2 = () => { data: dataTodos, isLoading: isLoadingTodos, isError: isErrorTodos, - preparePublish: preparePublishTodos, - } = useQuery(Todo2, { include: { assignees: {} } }); + // preparePublish: preparePublishTodos, + } = useQuery(Todo2, { mode: 'private', include: { assignees: {} } }); const { data: dataUsers, isLoading: isLoadingUsers, isError: isErrorUsers, - preparePublish: preparePublishUsers, - } = useQuery(User); + // preparePublish: preparePublishUsers, + } = useQuery(User, { mode: 'private' }); const space = useHypergraphSpace(); const createTodo = useCreateEntity(Todo2); const updateTodo = useUpdateEntity(Todo2); @@ -178,22 +178,22 @@ export const Todos2 = () => { onClick={async () => { try { setIsPreparingPublish(true); - const usersResult = await preparePublishUsers(); - console.log('users ops & diff', usersResult); - const todosResult = await preparePublishTodos(); - console.log('todos ops & diff', todosResult); + // const usersResult = await preparePublishUsers(); + // console.log('users ops & diff', usersResult); + // const todosResult = await preparePublishTodos(); + // console.log('todos ops & diff', todosResult); - if (todosResult && usersResult) { - setPublishData({ - newEntities: [...todosResult.newEntities, ...usersResult.newEntities], - deletedEntities: [...todosResult.deletedEntities, ...usersResult.deletedEntities], - updatedEntities: [...todosResult.updatedEntities, ...usersResult.updatedEntities], - }); - setIsPublishDiffModalOpen(true); - } else { - console.error('preparing publishing error', todosResult, usersResult); - throw new Error('Failed to prepare the publishing operations'); - } + // if (todosResult && usersResult) { + // setPublishData({ + // newEntities: [...todosResult.newEntities, ...usersResult.newEntities], + // deletedEntities: [...todosResult.deletedEntities, ...usersResult.deletedEntities], + // updatedEntities: [...todosResult.updatedEntities, ...usersResult.updatedEntities], + // }); + // setIsPublishDiffModalOpen(true); + // } else { + // console.error('preparing publishing error', todosResult, usersResult); + // throw new Error('Failed to prepare the publishing operations'); + // } } catch (error) { console.error('preparing publishing error', error); alert('Failed to prepare the publishing operations'); @@ -229,6 +229,7 @@ export const Todos2 = () => { ].flat(); const publishOpsResult = await publishOps({ ops, + // @ts-expect-error - TODO: fix the types error walletClient: smartAccountWalletClient, space, name: 'Update users and todos', diff --git a/apps/events/src/components/users/users-merged.tsx b/apps/events/src/components/users/users-merged.tsx index 76124488..e5ec5642 100644 --- a/apps/events/src/components/users/users-merged.tsx +++ b/apps/events/src/components/users/users-merged.tsx @@ -4,7 +4,7 @@ import { Spinner } from '../spinner'; import { Button } from '../ui/button'; export const UsersMerged = () => { - const { data, isLoading, isError } = useQuery(User); + const { data, isLoading, isError } = useQuery(User, { mode: 'private' }); const deleteEntity = useDeleteEntity(); return ( diff --git a/packages/hypergraph-react/src/use-query.tsx b/packages/hypergraph-react/src/use-query.tsx index a8dbfdcb..6e9e9f5b 100644 --- a/packages/hypergraph-react/src/use-query.tsx +++ b/packages/hypergraph-react/src/use-query.tsx @@ -1,21 +1,17 @@ -import { type Entity, Type, Utils, store } from '@graphprotocol/hypergraph'; -import { useSelector } from '@xstate/store/react'; +import { type Entity, Type, Utils } from '@graphprotocol/hypergraph'; import type * as Schema from 'effect/Schema'; -import { useMemo } from 'react'; import { useQueryLocal } from './HypergraphSpaceContext.js'; -import { generateDeleteOps } from './internal/generate-delete-ops.js'; -import { useGenerateCreateOps } from './internal/use-generate-create-ops.js'; -import { useGenerateUpdateOps } from './internal/use-generate-update-ops.js'; -import { parseResult, useQueryPublic } from './internal/use-query-public.js'; -import type { DiffEntry, PublishDiffInfo } from './types.js'; +import { useQueryPublic } from './internal/use-query-public.js'; +import type { DiffEntry } from './types.js'; type QueryParams = { - mode?: 'merged' | 'public' | 'private'; + mode: 'public' | 'private'; filter?: { [K in keyof Schema.Schema.Type]?: Entity.EntityFieldFilter[K]> } | undefined; // TODO: for multi-level nesting it should only allow the allowed properties instead of Record> include?: { [K in keyof Schema.Schema.Type]?: Record> } | undefined; }; +// @ts-expect-error TODO: remove this function const mergeEntities = ( publicEntities: Entity.Entity[], localEntities: Entity.Entity[], @@ -47,6 +43,7 @@ const mergeEntities = ( return mergedData; }; +// @ts-expect-error TODO: remove this function const getDiff = ( type: S, publicEntities: Entity.Entity[], @@ -145,20 +142,20 @@ const getDiff = ( const preparePublishDummy = () => undefined; -export function useQuery(type: S, params?: QueryParams) { - const { mode = 'merged', filter, include } = params ?? {}; - const publicResult = useQueryPublic(type, { enabled: mode === 'public' || mode === 'merged', include }); - const localResult = useQueryLocal(type, { enabled: mode === 'private' || mode === 'merged', filter, include }); - const mapping = useSelector(store, (state) => state.context.mapping); - const generateCreateOps = useGenerateCreateOps(type, mode === 'merged'); - const generateUpdateOps = useGenerateUpdateOps(type, mode === 'merged'); - - const mergedData = useMemo(() => { - if (mode !== 'merged' || publicResult.isLoading) { - return localResult.entities; - } - return mergeEntities(publicResult.data, localResult.entities, localResult.deletedEntities); - }, [mode, publicResult.isLoading, publicResult.data, localResult.entities, localResult.deletedEntities]); +export function useQuery(type: S, params: QueryParams) { + const { mode, filter, include } = params; + const publicResult = useQueryPublic(type, { enabled: mode === 'public', include }); + const localResult = useQueryLocal(type, { enabled: mode === 'private', filter, include }); + // const mapping = useSelector(store, (state) => state.context.mapping); + // const generateCreateOps = useGenerateCreateOps(type, mode === 'merged'); + // const generateUpdateOps = useGenerateUpdateOps(type, mode === 'merged'); + + // const mergedData = useMemo(() => { + // if (mode !== 'merged' || publicResult.isLoading) { + // return localResult.entities; + // } + // return mergeEntities(publicResult.data, localResult.entities, localResult.deletedEntities); + // }, [mode, publicResult.isLoading, publicResult.data, localResult.entities, localResult.deletedEntities]); if (mode === 'public') { return { @@ -168,58 +165,56 @@ export function useQuery(type: S, params?: }; } - if (mode === 'private') { - return { - ...publicResult, - data: localResult.entities, - deleted: localResult.deletedEntities, - preparePublish: preparePublishDummy, - }; - } - - const preparePublish = async (): Promise => { - // @ts-expect-error TODO should use the actual type instead of the name in the mapping - const typeName = type.name; - const mappingEntry = mapping?.[typeName]; - if (!mappingEntry) { - throw new Error(`Mapping entry for ${typeName} not found`); - } - - const result = await publicResult.refetch(); - if (!result.data) { - throw new Error('No data found'); - } - const diff = getDiff( - type, - parseResult(result.data, type, mappingEntry, mapping).data, - localResult.entities, - localResult.deletedEntities, - ); - - const newEntities = diff.newEntities.map((entity) => { - const { ops: createOps } = generateCreateOps(entity); - return { id: entity.id, entity, ops: createOps }; - }); - - const updatedEntities = diff.updatedEntities.map((updatedEntityInfo) => { - const { ops: updateOps } = generateUpdateOps({ id: updatedEntityInfo.id, diff: updatedEntityInfo.diff }); - return { ...updatedEntityInfo, ops: updateOps }; - }); - - const deletedEntities = await Promise.all( - diff.deletedEntities.map(async (entity) => { - const deleteOps = await generateDeleteOps(entity); - return { id: entity.id, entity, ops: deleteOps }; - }), - ); - - return { newEntities, updatedEntities, deletedEntities }; - }; - return { ...publicResult, - data: mergedData, + data: localResult.entities, deleted: localResult.deletedEntities, - preparePublish: !publicResult.isLoading ? preparePublish : preparePublishDummy, + preparePublish: preparePublishDummy, }; + + // const preparePublish = async (): Promise => { + // // @ts-expect-error TODO should use the actual type instead of the name in the mapping + // const typeName = type.name; + // const mappingEntry = mapping?.[typeName]; + // if (!mappingEntry) { + // throw new Error(`Mapping entry for ${typeName} not found`); + // } + + // const result = await publicResult.refetch(); + // if (!result.data) { + // throw new Error('No data found'); + // } + // const diff = getDiff( + // type, + // parseResult(result.data, type, mappingEntry, mapping).data, + // localResult.entities, + // localResult.deletedEntities, + // ); + + // const newEntities = diff.newEntities.map((entity) => { + // const { ops: createOps } = generateCreateOps(entity); + // return { id: entity.id, entity, ops: createOps }; + // }); + + // const updatedEntities = diff.updatedEntities.map((updatedEntityInfo) => { + // const { ops: updateOps } = generateUpdateOps({ id: updatedEntityInfo.id, diff: updatedEntityInfo.diff }); + // return { ...updatedEntityInfo, ops: updateOps }; + // }); + + // const deletedEntities = await Promise.all( + // diff.deletedEntities.map(async (entity) => { + // const deleteOps = await generateDeleteOps(entity); + // return { id: entity.id, entity, ops: deleteOps }; + // }), + // ); + + // return { newEntities, updatedEntities, deletedEntities }; + // }; + + // return { + // ...publicResult, + // data: mergedData, + // deleted: localResult.deletedEntities, + // preparePublish: !publicResult.isLoading ? preparePublish : preparePublishDummy, + // }; }