diff --git a/api/v2/resource_service.go b/api/v2/resource_service.go index e80fcf4f6..36a352432 100644 --- a/api/v2/resource_service.go +++ b/api/v2/resource_service.go @@ -73,6 +73,9 @@ func (s *APIV2Service) GetResource(ctx context.Context, request *apiv2pb.GetReso if err != nil { return nil, status.Errorf(codes.Internal, "failed to list resources: %v", err) } + if resource == nil { + return nil, status.Errorf(codes.NotFound, "resource not found") + } return &apiv2pb.GetResourceResponse{ Resource: s.convertResourceFromStore(ctx, resource), diff --git a/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx b/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx index 71faad628..d69fd648a 100644 --- a/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx +++ b/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx @@ -1,4 +1,5 @@ import { useContext, useEffect } from "react"; +import useLoading from "@/hooks/useLoading"; import { useMemoStore } from "@/store/v1"; import MemoContent from ".."; import { RendererContext } from "../types"; @@ -11,17 +12,21 @@ interface Props { const EmbeddedMemo = ({ memoId }: Props) => { const context = useContext(RendererContext); + const loadingState = useLoading(); const memoStore = useMemoStore(); const memo = memoStore.getMemoById(memoId); const resourceName = `memos/${memoId}`; useEffect(() => { - memoStore.getOrFetchMemoById(memoId); + memoStore.getOrFetchMemoById(memoId).finally(() => loadingState.setFinish()); }, [memoId]); - if (!memo) { + if (loadingState.isLoading) { return null; } + if (!memo) { + return ; + } if (memoId === context.memoId || context.embeddedMemos.has(resourceName)) { return ; } diff --git a/web/src/components/MemoContent/EmbeddedContent/EmbeddedResource.tsx b/web/src/components/MemoContent/EmbeddedContent/EmbeddedResource.tsx index 620d6b37c..77a8e6a47 100644 --- a/web/src/components/MemoContent/EmbeddedContent/EmbeddedResource.tsx +++ b/web/src/components/MemoContent/EmbeddedContent/EmbeddedResource.tsx @@ -1,7 +1,9 @@ import classNames from "classnames"; import { useEffect } from "react"; import MemoResourceListView from "@/components/MemoResourceListView"; +import useLoading from "@/hooks/useLoading"; import { useResourceStore } from "@/store/v1"; +import Error from "./Error"; interface Props { resourceId: number; @@ -34,17 +36,21 @@ const getAdditionalClassNameWithParams = (params: URLSearchParams) => { }; const EmbeddedResource = ({ resourceId, params: paramsStr }: Props) => { + const loadingState = useLoading(); const resourceStore = useResourceStore(); const resource = resourceStore.getResourceById(resourceId); const params = new URLSearchParams(paramsStr); useEffect(() => { - resourceStore.getOrFetchResourceById(resourceId); + resourceStore.getOrFetchResourceById(resourceId).finally(() => loadingState.setFinish()); }, [resourceId]); - if (!resource) { + if (loadingState.isLoading) { return null; } + if (!resource) { + return ; + } return (