{"id":11243,"date":"2023-03-10T02:28:28","date_gmt":"2023-03-09T22:58:28","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/"},"modified":"2023-03-10T02:28:28","modified_gmt":"2023-03-09T22:58:28","slug":"using-trpc-in-astro-and-its-react-islands-3021","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/","title":{"rendered":"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TRPC \u062f\u0631 Astro \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0622\u0646 (React)."},"content":{"rendered":"<div data-article-id=\"1394818\" id=\"article-body\">\n<p>\u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TRPC \u0631\u0627 \u062f\u0631 \u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc Next.js \u062f\u0631 \u0645\u062d\u0644 \u06a9\u0627\u0631\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u0645\u060c \u0648 \u0648\u0627\u0642\u0639\u0627\u064b \u0627\u0632 \u0627\u06cc\u0645\u0646\u06cc \u0633\u0631\u062a\u0627\u0633\u0631\u06cc \u06a9\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0627 API\u0647\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u062e\u0648\u0634\u0645 \u0622\u0645\u062f.<br \/>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 TRPC \u0631\u0627 \u062f\u0631 \u0648\u0628 \u0633\u0627\u06cc\u062a \u062e\u0648\u062f\u0645 \u06a9\u0647 \u0627\u0632 Astro \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645.<br \/>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TRPC \u062f\u0631 Astro \u0628\u0627\u06cc\u062f \u0645\u0631\u0627\u062d\u0644\u06cc \u0631\u0627 \u0637\u06cc \u06a9\u0631\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D9%86%D8%B5%D8%A8_%D9%BE%DA%A9%DB%8C%D8%AC_%D9%87%D8%A7%DB%8C_%D9%85%D9%88%D8%B1%D8%AF_%D9%86%DB%8C%D8%A7%D8%B2\" >\u0646\u0635\u0628 \u067e\u06a9\u06cc\u062c \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D8%B2%D9%85%DB%8C%D9%86%D9%87_TRPC\" >\u062a\u0646\u0638\u06cc\u0645 \u0632\u0645\u06cc\u0646\u0647 TRPC<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_TRPC\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0633\u0631\u0648\u0631 TRPC<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_API_Route_%D8%AF%D8%B1_Astro\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc API Route \u062f\u0631 Astro<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_TRPC\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u0634\u062a\u0631\u06cc TRPC<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA_TRPC_%D8%AF%D8%B1_%D9%81%D8%A7%DB%8C%D9%84_%D9%87%D8%A7%DB%8C_astro\" >\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc astro<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/using-trpc-in-astro-and-its-react-islands-3021\/#%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA_TRPC_%D8%AF%D8%B1_%D8%AC%D8%B2%D8%A7%DB%8C%D8%B1_React\" >\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u062f\u0631 \u062c\u0632\u0627\u06cc\u0631 React<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%B5%D8%A8_%D9%BE%DA%A9%DB%8C%D8%AC_%D9%87%D8%A7%DB%8C_%D9%85%D9%88%D8%B1%D8%AF_%D9%86%DB%8C%D8%A7%D8%B2\"><\/span>\n<p>  \u0646\u0635\u0628 \u067e\u06a9\u06cc\u062c \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>npm install @tanstack\/react-query @trpc\/client @trpc\/server @trpc\/react-query\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D8%B2%D9%85%DB%8C%D9%86%D9%87_TRPC\"><\/span>\n<p>  \u062a\u0646\u0638\u06cc\u0645 \u0632\u0645\u06cc\u0646\u0647 TRPC<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ \/src\/server\/context.ts<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getUser<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@astro-auth\/core<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">inferAsyncReturnType<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/server<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FetchCreateContextFnOptions<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/server\/adapters\/fetch<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">createContext<\/span><span class=\"p\">({<\/span>\n  <span class=\"nx\">req<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">resHeaders<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}:<\/span> <span class=\"nx\">FetchCreateContextFnOptions<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">user<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">getUser<\/span><span class=\"p\">({<\/span> <span class=\"na\">server<\/span><span class=\"p\">:<\/span> <span class=\"nx\">req<\/span> <span class=\"p\">});<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">resHeaders<\/span><span class=\"p\">,<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">Context<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">inferAsyncReturnType<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">createContext<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0645\u0633\u06cc\u0631 TRPC \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0641\u0639\u0644\u06cc \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u0645\u060c \u0622\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0645 <code>getUser()<\/code> \u062a\u0645\u0627\u0633 \u0627\u0632 <code>@astro-auth<\/code>.  \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0628\u0647 \u0632\u0645\u06cc\u0646\u0647\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0628\u0639\u062f\u0627\u064b \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645 (\u0628\u0647 \u0632\u06cc\u0631 \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f).<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_TRPC\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0633\u0631\u0648\u0631 TRPC<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/server\/router.ts<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">initTRPC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TRPCError<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/server<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">z<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">zod<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">prisma<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/lib\/prisma<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Comment<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@prisma\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Context<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/context<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">t<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">initTRPC<\/span><span class=\"p\">.<\/span><span class=\"nx\">context<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Context<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">().<\/span><span class=\"nx\">create<\/span><span class=\"p\">();<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">middleware<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">t<\/span><span class=\"p\">.<\/span><span class=\"nx\">middleware<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">publicProcedure<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">t<\/span><span class=\"p\">.<\/span><span class=\"nx\">procedure<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">isAdmin<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">middleware<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">ctx<\/span><span class=\"p\">,<\/span> <span class=\"nx\">next<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">TRPCError<\/span><span class=\"p\">({<\/span> <span class=\"na\">code<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">UNAUTHORIZED<\/span><span class=\"dl\">'<\/span> <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">next<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">ctx<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">adminProcedure<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">publicProcedure<\/span><span class=\"p\">.<\/span><span class=\"nx\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">isAdmin<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">appRouter<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">t<\/span><span class=\"p\">.<\/span><span class=\"nx\">router<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">getCommentsForBlog<\/span><span class=\"p\">:<\/span> <span class=\"nx\">publicProcedure<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">(<\/span><span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">())<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">query<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">input<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">blogUrl<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">src\/content<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">''<\/span><span class=\"p\">).<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">.mdx<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">''<\/span><span class=\"p\">);<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">commentsForBlogUrl<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">?.<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">findFirst<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">blogUrl<\/span> <span class=\"k\">as<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">??<\/span> <span class=\"kc\">undefined<\/span> <span class=\"p\">},<\/span>\n        <span class=\"na\">include<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">Comment<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">orderBy<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">createdAt<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">desc<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">});<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">allCommentsInDbForPost<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">commentsForBlogUrl<\/span><span class=\"p\">?.<\/span><span class=\"nx\">Comment<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nx\">allCommentsInDbForPost<\/span> <span class=\"o\">??<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}),<\/span>\n  <span class=\"na\">createCommentForBlog<\/span><span class=\"p\">:<\/span> <span class=\"nx\">publicProcedure<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">(<\/span>\n      <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">object<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">comment<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">(),<\/span>\n        <span class=\"na\">author<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">(),<\/span>\n        <span class=\"na\">blogUrl<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">(),<\/span>\n      <span class=\"p\">})<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">mutation<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">input<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">comment<\/span><span class=\"p\">,<\/span> <span class=\"nx\">blogUrl<\/span><span class=\"p\">,<\/span> <span class=\"nx\">author<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">input<\/span><span class=\"p\">;<\/span>\n      <span class=\"kd\">let<\/span> <span class=\"na\">commentInDb<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Comment<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"p\">;<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">blog<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">?.<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">findFirst<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"nx\">blogUrl<\/span> <span class=\"p\">},<\/span>\n      <span class=\"p\">});<\/span>\n      <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">commentInDb<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">?.<\/span><span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"nx\">create<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">author<\/span><span class=\"p\">:<\/span> <span class=\"nx\">author<\/span> <span class=\"o\">??<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">comment<\/span> <span class=\"o\">??<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">post<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n              <span class=\"na\">connectOrCreate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n                <span class=\"na\">create<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n                  <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"nx\">blogUrl<\/span> <span class=\"o\">??<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n                <span class=\"p\">},<\/span>\n                <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n                  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">blog<\/span><span class=\"p\">?.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">??<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n                <span class=\"p\">},<\/span>\n              <span class=\"p\">},<\/span>\n            <span class=\"p\">},<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Error saving comment<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Error saving comment<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">commentInDb<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Error saving comment<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">success<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n    <span class=\"p\">}),<\/span>\n  <span class=\"na\">deleteCommentForBlog<\/span><span class=\"p\">:<\/span> <span class=\"nx\">adminProcedure<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">(<\/span><span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">object<\/span><span class=\"p\">({<\/span> <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">number<\/span><span class=\"p\">()<\/span> <span class=\"p\">}))<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">mutation<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">input<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">let<\/span> <span class=\"nx\">deleteComment<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">deleteComment<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">?.<\/span><span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"k\">delete<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Error deleting comment<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">deleteComment<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Error deleting comment<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">success<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n    <span class=\"p\">}),<\/span>\n  <span class=\"na\">sendContactForm<\/span><span class=\"p\">:<\/span> <span class=\"nx\">publicProcedure<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">(<\/span>\n      <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">object<\/span><span class=\"p\">({<\/span> <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">().<\/span><span class=\"nx\">nullable<\/span><span class=\"p\">(),<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"kr\">string<\/span><span class=\"p\">().<\/span><span class=\"nx\">nullable<\/span><span class=\"p\">()<\/span> <span class=\"p\">})<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nx\">mutation<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">input<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">email<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"k\">import<\/span><span class=\"p\">.<\/span><span class=\"nx\">meta<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">FORMSPREE_URL<\/span><span class=\"o\">!<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">post<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">Accept<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">application\/json<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n          <span class=\"p\">},<\/span>\n          <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">input<\/span><span class=\"p\">),<\/span>\n        <span class=\"p\">}).<\/span><span class=\"k\">catch<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\n          <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n        <span class=\"p\">});<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">success<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">missingdata<\/span><span class=\"dl\">'<\/span> <span class=\"p\">};<\/span>\n    <span class=\"p\">}),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">AppRouter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">appRouter<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0646 \u06cc\u06a9 \u0631\u0648\u06cc\u0647 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645 <code>adminProcedure<\/code>\u060c \u06a9\u0647 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0631\u0648\u06cc \u0622\u0646 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f\u0645.  \u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u0637\u0645\u0626\u0646 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f \u06a9\u0647 \u0647\u0631 \u0645\u0633\u06cc\u0631\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u0647 \u0641\u0642\u0637 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u0642\u0627\u0628\u0644 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0628\u0627\u0634\u062f.<br \/>\u067e\u0633 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u06cc\u0647 \u0647\u0627\u060c \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc \u06a9\u0646\u0645.  \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f <code>deleteCommentForBlog<\/code> \u0645\u0633\u06cc\u0631 \u06a9\u0647 \u0645\u0633\u06cc\u0631 \u067e\u0634\u062a <code>adminProcedure<\/code>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_API_Route_%D8%AF%D8%B1_Astro\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc API Route \u062f\u0631 Astro<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ \/src\/pages\/api\/trpc\/[trpc].ts<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">fetchRequestHandler<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/server\/adapters\/fetch<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">APIRoute<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">astro<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createContext<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/..\/..\/server\/context<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">appRouter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/..\/..\/server\/router<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">all<\/span><span class=\"p\">:<\/span> <span class=\"nx\">APIRoute<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">request<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">fetchRequestHandler<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">endpoint<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/trpc<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">req<\/span><span class=\"p\">:<\/span> <span class=\"nx\">request<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">router<\/span><span class=\"p\">:<\/span> <span class=\"nx\">appRouter<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">createContext<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0646 \u0627\u0632 \u0622\u062f\u0627\u067e\u062a\u0648\u0631 fetch \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0633\u0645\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a \u0628\u0647 \u0631\u0648\u062a\u0631 TRPC \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.<br \/>\u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u067e\u0630\u06cc\u0631 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 Astro \u0627\u0632 API \u0647\u0627\u06cc \u0628\u0633\u062a\u0631 \u0648\u0628 \u062f\u0627\u062e\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>Response<\/code> &#038; <code>Request<\/code>.<br \/>\u0645\u0627 \u0631\u0648\u062a\u0631 \u0648 \u0632\u0645\u06cc\u0646\u0647 \u0631\u0627 \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0646\u062f \u0645\u06cc \u062f\u0647\u06cc\u0645 \u0648 \u0622\u0645\u0627\u062f\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u0647\u0633\u062a\u06cc\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_TRPC\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u0634\u062a\u0631\u06cc TRPC<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0632\u06cc\u0631\u0627 \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0627\u0632 TRPC \u0647\u0645 \u062f\u0631 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u062f\u0631 \u0635\u0641\u062d\u0627\u062a Astro \u0648 \u0647\u0645 \u062f\u0631 \u062c\u0632\u06cc\u0631\u0647 \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645.<br \/>\u062c\u0632\u0627\u06cc\u0631 \u0645\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 React \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u062a\u0627 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC React \u0631\u0627 \u0646\u06cc\u0632 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ \/src\/client\/index.ts<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createTRPCReact<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/react-query<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createTRPCProxyClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">httpBatchLink<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">AppRouter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/server\/router<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">trpcReact<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">createTRPCReact<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">AppRouter<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">trpcAstro<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">createTRPCProxyClient<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">AppRouter<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">links<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"nx\">httpBatchLink<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">http:\/\/localhost:3000\/api\/trpc<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">}),<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">trpcReact<\/span><span class=\"p\">,<\/span> <span class=\"nx\">trpcAstro<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA_TRPC_%D8%AF%D8%B1_%D9%81%D8%A7%DB%8C%D9%84_%D9%87%D8%A7%DB%8C_astro\"><\/span>\n<p>  \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u062f\u0631 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc astro<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0627\u0632 \u06a9\u0644\u0627\u06cc\u0646\u062a Astro TRPC \u0628\u0631\u0627\u06cc \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f <code>&lt;script&gt;<\/code> \u0628\u0631\u0686\u0633\u0628 \u0631\u0648\u06cc \u0645\u0634\u062a\u0631\u06cc \u0628\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc TRPC.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/ \/src\/pages\/context\/index.astro export const prerender = true; import Layout\nfrom '..\/..\/layouts\/Layout.astro';\n\n&lt;form id=\"contactForm\"&gt;\n  &lt;label class=\"flex flex-col gap-2 mb-4\" for=\"email\"&gt;\n    Your e-mail\n    &lt;input\n      class=\"py-2 px-4 bg-white border-secondary border-2 rounded-lg\"\n      id=\"email\"\n      type=\"email\"\n      name=\"email\"\n      placeholder=\"info@example.com\"\n      required\n    \/&gt;\n  &lt;\/label&gt;\n  &lt;label class=\"flex flex-col gap-2\" for=\"message\"&gt;\n    Your message\n    &lt;textarea\n      class=\"py-2 px-4 bg-white border-secondary border-2 rounded-lg\"\n      rows={3}\n      id=\"message\"\n      name=\"message\"\n      placeholder=\"Hey, I would like to get in touch with you\"\n      required&gt;&lt;\/textarea&gt;\n  &lt;\/label&gt;\n\n  &lt;button\n    class=\"px-8 mt-4 py-4 bg-secondary text-white rounded-lg lg:hover:scale-[1.04] transition-transform disabled:opacity-50\"\n    type=\"submit\"\n    id=\"submitBtn\"\n  &gt;\n    Submit\n  &lt;\/button&gt;\n  &lt;div id=\"missingData\" class=\"text-red-500 font-bold hidden\"&gt;\n    Something went from while processing the contact form. Try again later.\n  &lt;\/div&gt;\n  &lt;div id=\"error\" class=\"text-red-500 font-bold hidden\"&gt;\n    Something went from while processing the contact form. Try again later.\n  &lt;\/div&gt;\n&lt;\/form&gt;\n&lt;script&gt;\n  import { trpcAstro } from '..\/..\/client';\n  const form = document.getElementById('contactForm') as HTMLFormElement | null;\n  form?.addEventListener('submit', async e =&gt; {\n    e.preventDefault();\n    const formData = new FormData(form);\n    const result = await trpcAstro.sendContactForm.mutate({\n      message: formData.get('message') as string | null,\n      email: formData.get('email') as string | null,\n    });\n    if (result.status === 'success') {\n      window.location.href=\"https:\/\/dev.to\/contact\/thanks\";\n    }\n  });\n&lt;\/script&gt;\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0646 \u0627\u0632 \u0645\u0634\u062a\u0631\u06cc TRPC \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645\u060c \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0631\u0648\u06cc \u06a9\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u0645 \u0648 \u062f\u0642\u06cc\u0642\u0627\u064b \u0645\u06cc \u062f\u0627\u0646\u0645 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0648\u0631\u0648\u062f\u06cc \u0645\u0633\u06cc\u0631 \u0645\u0648\u0631\u062f \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0633\u062a \u0648 \u0686\u0647 \u0686\u06cc\u0632\u06cc \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA_TRPC_%D8%AF%D8%B1_%D8%AC%D8%B2%D8%A7%DB%8C%D8%B1_React\"><\/span>\n<p>  \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u062f\u0631 \u062c\u0632\u0627\u06cc\u0631 React<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u0628\u0627\u0647\u0627\u0634 \u200b\u200b\u06a9\u0627\u0631 \u06a9\u0646\u0645 <code>@tanstack\/react-query<\/code> \u0628\u0631\u0627\u06cc \u062a\u0633\u0647\u06cc\u0644 \u0648\u0627\u06a9\u0634\u06cc\/\u062c\u0647\u0634 \u0622\u0633\u0627\u0646\u062a\u0631 \u062f\u0631 \u06a9\u062f React \u0645\u0646.<br \/>\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644\u060c \u0645\u0646 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a TRPC \u0631\u0627 \u0646\u0645\u0648\u0646\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645 <strong>\u0648<\/strong> \u0622 <code>QueryClient<\/code> \u0628\u0631\u0627\u06cc <code>react-query<\/code>.<br \/>\u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a wrapper \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u0645\u060c \u06a9\u0647 \u0645\u0624\u0644\u0641\u0647 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u06a9\u0647 \u062a\u0645\u0627\u0633\u200c\u0647\u0627\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc TRPC \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0645\u06cc\u200c\u067e\u06cc\u0686\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ \/src\/components\/CommentOverviewWrapper.tsx<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">QueryClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">QueryClientProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@tanstack\/react-query<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CommentOverview<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/CommentOverview<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">trpcReact<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">httpBatchLink<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@trpc\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">CommentsOverviewWrapper<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">queryClient<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">QueryClient<\/span><span class=\"p\">());<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">trpcClient<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span>\n    <span class=\"nx\">trpcReact<\/span><span class=\"p\">.<\/span><span class=\"nx\">createClient<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">links<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n        <span class=\"nx\">httpBatchLink<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">http:\/\/localhost:3000\/api\/trpc<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">}),<\/span>\n      <span class=\"p\">],<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">trpcReact<\/span><span class=\"p\">.<\/span><span class=\"nc\">Provider<\/span> <span class=\"na\">client<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">trpcClient<\/span><span class=\"si\">}<\/span> <span class=\"na\">queryClient<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">queryClient<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">QueryClientProvider<\/span> <span class=\"na\">client<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">queryClient<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">CommentOverview<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">QueryClientProvider<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">trpcReact<\/span><span class=\"p\">.<\/span><span class=\"nc\">Provider<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">CommentsOverviewWrapper<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u0648\u0627\u0642\u0639\u06cc \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u062f\u0631 \u0622\u0645\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ \/src\/components\/CommentOverview.tsx<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Comment<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@prisma\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">trpcReact<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">CommentOverview<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">upToDateCommentsQuery<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">trpcReact<\/span><span class=\"p\">.<\/span><span class=\"nx\">getAllComments<\/span><span class=\"p\">.<\/span><span class=\"nx\">useQuery<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">mutate<\/span><span class=\"p\">:<\/span> <span class=\"nx\">deleteComment<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">trpcReact<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteCommentForBlog<\/span><span class=\"p\">.<\/span><span class=\"nx\">useMutation<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">onError<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Error deleting comment<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">onSuccess<\/span><span class=\"p\">:<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">error<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Succesfully deleted comment<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">onSettled<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">upToDateCommentsQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">refetch<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">commentsReduced<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">upToDateCommentsQuery<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span><span class=\"p\">?.<\/span><span class=\"nx\">reduce<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">{<\/span>\n    <span class=\"p\">[<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">]:<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">upToDateCommentsQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">(<\/span><span class=\"nx\">acc<\/span><span class=\"p\">,<\/span> <span class=\"nx\">cur<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n      <span class=\"p\">...<\/span><span class=\"nx\">acc<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">[<\/span><span class=\"nx\">cur<\/span><span class=\"p\">.<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span><span class=\"p\">]:<\/span> <span class=\"p\">[...(<\/span><span class=\"nx\">acc<\/span><span class=\"p\">[<\/span><span class=\"nx\">cur<\/span><span class=\"p\">.<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span><span class=\"p\">]<\/span> <span class=\"o\">||<\/span> <span class=\"p\">[]),<\/span> <span class=\"nx\">cur<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">}),<\/span>\n    <span class=\"p\">{}<\/span>\n  <span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"grid lg:grid-cols-2 gap-6\"<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"si\">{<\/span><span class=\"nx\">commentsReduced<\/span>\n        <span class=\"p\">?<\/span> <span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nx\">entries<\/span><span class=\"p\">(<\/span><span class=\"nx\">commentsReduced<\/span><span class=\"p\">).<\/span><span class=\"nx\">map<\/span><span class=\"p\">(([<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">val<\/span><span class=\"p\">])<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n              <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">key<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                <span class=\"p\">&lt;<\/span><span class=\"nt\">h2<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"font-bold mb-4 text-xl\"<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">key<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">h2<\/span><span class=\"p\">&gt;<\/span>\n                <span class=\"p\">&lt;<\/span><span class=\"nt\">ul<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"flex flex-col gap-y-2\"<\/span><span class=\"p\">&gt;<\/span>\n                  <span class=\"si\">{<\/span><span class=\"nx\">val<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">comment<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n                    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"flex gap-x-2\"<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                      <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span>\n                        <span class=\"na\">type<\/span><span class=\"p\">=<\/span><span class=\"s\">\"button\"<\/span>\n                        <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                          <span class=\"nx\">deleteComment<\/span><span class=\"p\">({<\/span> <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">});<\/span>\n                        <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n                      <span class=\"p\">&gt;<\/span>\n                        <span class=\"p\">&lt;<\/span><span class=\"nt\">svg<\/span>\n                          <span class=\"na\">xmlns<\/span><span class=\"p\">=<\/span><span class=\"s\">\"http:\/\/www.w3.org\/2000\/svg\"<\/span>\n                          <span class=\"na\">fill<\/span><span class=\"p\">=<\/span><span class=\"s\">\"none\"<\/span>\n                          <span class=\"na\">viewBox<\/span><span class=\"p\">=<\/span><span class=\"s\">\"0 0 24 24\"<\/span>\n                          <span class=\"na\">strokeWidth<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mf\">1.5<\/span><span class=\"si\">}<\/span>\n                          <span class=\"na\">stroke<\/span><span class=\"p\">=<\/span><span class=\"s\">\"currentColor\"<\/span>\n                          <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"min-w-[1.5rem] h-6 text-red-600\"<\/span>\n                        <span class=\"p\">&gt;<\/span>\n                          <span class=\"p\">&lt;<\/span><span class=\"nt\">path<\/span>\n                            <span class=\"na\">strokeLinecap<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n                            <span class=\"na\">strokeLinejoin<\/span><span class=\"p\">=<\/span><span class=\"s\">\"round\"<\/span>\n                            <span class=\"na\">d<\/span><span class=\"p\">=<\/span><span class=\"s\">\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"<\/span>\n                          <span class=\"p\">\/&gt;<\/span>\n                        <span class=\"p\">&lt;\/<\/span><span class=\"nt\">svg<\/span><span class=\"p\">&gt;<\/span>\n                      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n                      <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\n                        <span class=\"p\">&lt;<\/span><span class=\"nt\">span<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"font-bold\"<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"nx\">author<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span> :<span class=\"si\">{<\/span><span class=\"dl\">'<\/span><span class=\"s1\"> <\/span><span class=\"dl\">'<\/span><span class=\"si\">}<\/span>\n                        <span class=\"si\">{<\/span><span class=\"nx\">comment<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"si\">}<\/span>\n                      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\n                    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n                  <span class=\"p\">))<\/span><span class=\"si\">}<\/span>\n                <span class=\"p\">&lt;\/<\/span><span class=\"nt\">ul<\/span><span class=\"p\">&gt;<\/span>\n              <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">);<\/span>\n          <span class=\"p\">})<\/span>\n        <span class=\"p\">:<\/span> <span class=\"kc\">null<\/span><span class=\"si\">}<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">CommentOverview<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0648\u0627\u06a9\u0634\u06cc \u0647\u0645\u0647 \u0646\u0638\u0631\u0627\u062a \u0628\u0647 \u0622\u0633\u0627\u0646\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0633\u062a <code>const upToDateCommentQuery = trpcReact.getAllComments.useQuery()<\/code>.<br \/>\u062d\u0630\u0641 \u0646\u0638\u0631 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f <code>const { mutate: deleteComment } = trpcReact.deleteCommentForBlog.useMutation<\/code> \u0648 \u0633\u067e\u0633 \u062f\u0631 \u0645\u0646 <code>&lt;button&gt;<\/code>\u062a\u0645\u0627\u0633 \u06af\u06cc\u0631\u0646\u062f\u0647 \u06a9\u0644\u06cc\u06a9 <code>deleteComment({ id: comment.id });<\/code>.<\/p>\n<p>\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0645\u0641\u06cc\u062f \u0628\u0648\u062f\u0647 \u0628\u0627\u0634\u062f!<br \/>\u06a9\u062f \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 GitHub \u0645\u0646 \u06cc\u0627\u0641\u062a.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TRPC \u0631\u0627 \u062f\u0631 \u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc Next.js \u062f\u0631 \u0645\u062d\u0644 \u06a9\u0627\u0631\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u0645\u060c \u0648 \u0648\u0627\u0642\u0639\u0627\u064b \u0627\u0632 \u0627\u06cc\u0645\u0646\u06cc \u0633\u0631\u062a\u0627\u0633\u0631\u06cc \u06a9\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0627 API\u0647\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u062e\u0648\u0634\u0645 \u0622\u0645\u062f.\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 TRPC \u0631\u0627 \u062f\u0631 \u0648\u0628 \u0633\u0627\u06cc\u062a \u062e\u0648\u062f\u0645 \u06a9\u0647 \u0627\u0632 Astro \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645.\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TRPC &hellip;<\/p>\n","protected":false},"author":2,"featured_media":11244,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-11243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/11243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=11243"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/11243\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/11244"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=11243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=11243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=11243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}