<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>GraphQL on Techformist</title>
    <link>https://techformist.com/tags/graphql/</link>
    <description>Recent content in GraphQL on Techformist</description>
    <image>
      <url>https://techformist.com/logo.svg</url>
      <link>https://techformist.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 02 Sep 2019 06:30:00 +0000</lastBuildDate><atom:link href="https://techformist.com/tags/graphql/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Fake GraphQL APIs for Testing</title>
      <link>https://techformist.com/fake-graphql-API-test/</link>
      <pubDate>Mon, 02 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/fake-graphql-API-test/</guid>
      <description>&lt;p&gt;Speed up your GraphQL learning with fake GraphQL APIs!&lt;/p&gt;
&lt;p&gt;I love &lt;a href=&#34;https://jsonplaceholder.typicode.com/&#34;&gt;JSON Placeholder&lt;/a&gt;, but it serves only REST requests. I had been looking for something similar in GraphQL. Without longer-term, reliable options, I had reverted to &lt;a href=&#34;https://techformist.com/spin-up-your-own-local-graphql-server-within-15-min/&#34;&gt;creating my own fake GraphQL server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While having my own server is certainly useful, it can become a pain to demonstrate or outline a feature to all - either through a video, blog post, or in public forums.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Speed up your GraphQL learning with fake GraphQL APIs!</p>
<p>I love <a href="https://jsonplaceholder.typicode.com/">JSON Placeholder</a>, but it serves only REST requests. I had been looking for something similar in GraphQL. Without longer-term, reliable options, I had reverted to <a href="/spin-up-your-own-local-graphql-server-within-15-min/">creating my own fake GraphQL server</a>.</p>
<p>While having my own server is certainly useful, it can become a pain to demonstrate or outline a feature to all - either through a video, blog post, or in public forums.</p>
<p>Enter <a href="https://graphqlzero.almansi.me">GraphQLZero</a>.</p>
<p>GraphQLZero provides an API playground that you can use to quickly test your GraphQL clients, or put forward a point while demonstrating the client-side code.</p>
<p><img loading="lazy" src="/misc/graphql-faker-app.jpg" type="" alt=""  /></p>
<p>The app features GraphiQL interface that outlines the API documents, taking full advantage of self-documenting abilities of GraphQL.</p>
<p>I understand this is too early to get excited since there have been comparable services in the past. The challenge for the authors/maintainers will be to manage traffic and find ways to sustainably manage the application over a long term.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Create a simple to do app using Svelte and GraphQL</title>
      <link>https://techformist.com/todo-app-using-svelte-graphql/</link>
      <pubDate>Thu, 15 Aug 2019 15:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/todo-app-using-svelte-graphql/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s create a simple &amp;rsquo;to do&amp;rsquo; application using Svelte and GraphQL. The objective is to demonstrate getting started on a GraphQL query and insert operation in a Svelte component.&lt;/p&gt;
&lt;p&gt;If you are new to Svelte, you may want to go over what Svelte can do from the &lt;a href=&#34;https://svelte.dev/&#34;&gt;official site&lt;/a&gt;, or see &lt;a href=&#34;https://techformist.com/get-started-on-svelte/&#34;&gt;Svelte quick overview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, we will not quite dwell on the backend server in this post - you can follow along if you have any GraphQL backend. If not, I suggest you &lt;a href=&#34;https://techformist.com/spin-up-your-own-local-graphql-server-within-15-min/&#34;&gt;get started with a GraphQL setup of your own&lt;/a&gt; in the next 15 min. I will use the data structure and statements from the server setup described in that post.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let&rsquo;s create a simple &rsquo;to do&rsquo; application using Svelte and GraphQL. The objective is to demonstrate getting started on a GraphQL query and insert operation in a Svelte component.</p>
<p>If you are new to Svelte, you may want to go over what Svelte can do from the <a href="https://svelte.dev/">official site</a>, or see <a href="/get-started-on-svelte/">Svelte quick overview</a>.</p>
<p>Also, we will not quite dwell on the backend server in this post - you can follow along if you have any GraphQL backend. If not, I suggest you <a href="/spin-up-your-own-local-graphql-server-within-15-min/">get started with a GraphQL setup of your own</a> in the next 15 min. I will use the data structure and statements from the server setup described in that post.</p>
<p>I gather you would have installed <code>degit</code> to make your <code>svelte</code> life easier.</p>
<p>Create a new project using <code>degit</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">degit sveltejs/template svedo
</span></span><span class="line"><span class="cl"><span class="k">cd</span> svedo
</span></span><span class="line"><span class="cl">npm i
</span></span></code></pre></div><p>This will copy svelte template and install all required components.</p>
<p>We will also install Apollo client for GraphQL. Go back to command window and do another <code>npm</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm i --save apollo-boost graphql svelte-apollo
</span></span></code></pre></div><p>Run your application and say &lsquo;hello&rsquo; to the world.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm run dev
</span></span></code></pre></div><p>Open the project folder in VS Code and start changing stuff.</p>
<h5 id="mainjs">main.js</h5>
<p>Change your <code>main.js</code> for fun.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">App</span> <span class="nx">from</span> <span class="s2">&#34;./App.svelte&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">App</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">target</span><span class="o">:</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">props</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Mr. Anderson&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">app</span><span class="p">;</span>
</span></span></code></pre></div><h5 id="appsvelte">App.svelte</h5>
<p>Open <code>App.svelte</code>. There are two main things we do here -</p>
<ol>
<li>Point Apollo client towards our GraphQL server URL</li>
<li>Create a <code>Todo</code> Svelte component (we will create this next)</li>
</ol>
<p>Also, centre the whole thing. Never trust developers who don&rsquo;t put content at the centre.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">ApolloClient</span> <span class="nx">from</span> <span class="s2">&#34;apollo-boost&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">setClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;svelte-apollo&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">Todo</span> <span class="nx">from</span> <span class="s2">&#34;./Todo.svelte&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="kd">let</span> <span class="nx">name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ApolloClient</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">    <span class="nx">uri</span><span class="o">:</span> <span class="s2">&#34;http://localhost:5050/graphql&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">onError</span><span class="o">:</span> <span class="p">({</span> <span class="nx">networkError</span><span class="p">,</span> <span class="nx">graphQLErrors</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;graphQLErrors&#34;</span><span class="p">,</span> <span class="nx">graphQLErrors</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;networkError&#34;</span><span class="p">,</span> <span class="nx">networkError</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">setClient</span><span class="p">(</span><span class="nx">client</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">h1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="kc">purple</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nt">h5</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="kc">grey</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">centrify</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-align</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;centrify&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h5</span><span class="p">&gt;</span>Hello {name}!<span class="p">&lt;/</span><span class="nt">h5</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">Todo</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>You might remember from the server setup post linked earlier that we are running GraphQL server at port 5050. Other code is largely self explanatory and not that important.</p>
<h5 id="todosvelte">Todo.svelte</h5>
<p>Create a new file <code>Todo.svelte</code> in the same directory as <code>App.svelte</code>. We will code most of our application here.</p>
<p>First: write the GraphQL queries - one for query and one for insert, and get the client ready.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">getClient</span><span class="p">,</span> <span class="nx">query</span><span class="p">,</span> <span class="nx">mutate</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;svelte-apollo&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">gql</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;apollo-boost&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">GETTODO</span> <span class="o">=</span> <span class="nx">gql</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">    {
</span></span></span><span class="line"><span class="cl"><span class="sb">      allTodos {
</span></span></span><span class="line"><span class="cl"><span class="sb">        nodes {
</span></span></span><span class="line"><span class="cl"><span class="sb">          id
</span></span></span><span class="line"><span class="cl"><span class="sb">          title
</span></span></span><span class="line"><span class="cl"><span class="sb">          done
</span></span></span><span class="line"><span class="cl"><span class="sb">        }
</span></span></span><span class="line"><span class="cl"><span class="sb">      }
</span></span></span><span class="line"><span class="cl"><span class="sb">    }
</span></span></span><span class="line"><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">ADDTODO</span> <span class="o">=</span> <span class="nx">gql</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">    mutation($todoEdit: String!) {
</span></span></span><span class="line"><span class="cl"><span class="sb">      createTodo(input: { todo: { title: $todoEdit, done: false } }) {
</span></span></span><span class="line"><span class="cl"><span class="sb">        todo {
</span></span></span><span class="line"><span class="cl"><span class="sb">          id
</span></span></span><span class="line"><span class="cl"><span class="sb">          title
</span></span></span><span class="line"><span class="cl"><span class="sb">          done
</span></span></span><span class="line"><span class="cl"><span class="sb">        }
</span></span></span><span class="line"><span class="cl"><span class="sb">      }
</span></span></span><span class="line"><span class="cl"><span class="sb">    }
</span></span></span><span class="line"><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Next: add functionality to fetch to-do from server. You can incrementally add code to perform query and update operations within the <code>&lt;script&gt;</code> block.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">getClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">todoOp</span> <span class="o">=</span> <span class="nx">query</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="p">{</span> <span class="nx">query</span><span class="o">:</span> <span class="nx">GETTODO</span> <span class="p">});</span>
</span></span></code></pre></div><p>Add a function to insert a to-do record, and declare a variable which will hold the to-do value temporarily.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">todoEdit</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">addTodo</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todoAdd</span> <span class="o">=</span> <span class="nx">mutate</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mutation</span><span class="o">:</span> <span class="nx">ADDTODO</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">variables</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">todoEdit</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">data</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">todoEdit</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nx">todoOp</span><span class="p">.</span><span class="nx">refetch</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <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">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">&#34;error: &#34;</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Typically, we would want to just take the input, add to the list of to-dos, and call it a day. Here, we are &rsquo;re-fetching&rsquo; the results after insert just because we can.</p>
<p>PostGraphile passes back the the field values in update operation back in its response, other technologies/frameworks may not. This is where re-fetch has a role to play. Depending on your use case, you may or may not want to throw a query at server immediately after the update (or do it in one go on the server, which is the sane thing to do).</p>
<p>Add the HTML to the same <code>Todo.svelte</code> file to render the results fetched from server -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;text-align:center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h2</span><span class="p">&gt;</span><span class="nx">Svedos</span><span class="p">&lt;/</span><span class="nt">h2</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="err">#</span><span class="kr">await</span> <span class="nx">$todoOp</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;..</span> <span class="nx">loading</span><span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="o">:</span><span class="nx">then</span> <span class="nx">data</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="err">#</span><span class="nx">each</span> <span class="nx">data</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="s1">&#39;allTodos&#39;</span><span class="p">][</span><span class="s1">&#39;nodes&#39;</span><span class="p">]</span> <span class="nx">as</span> <span class="nx">todo</span><span class="p">,</span> <span class="nx">i</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="err">:</span><span class="na">done</span><span class="o">=</span><span class="s">&#34;{todo.done}&#34;</span><span class="p">&gt;{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">title</span><span class="p">}&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="err">/each}</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="o">:</span><span class="k">catch</span> <span class="nx">e</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nx">e</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="err">/await}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>We do the following tasks in the above block -</p>
<ol>
<li>Wait for the fetch operation from the function. The function gets executed when the component gets loaded. The <code>Todo.svelte</code> component loads when called by <code>App.svelte</code>, which itself is called by <code>main.js</code></li>
<li>A helpful message <code>...loading</code> is displayed till the data is fetched</li>
<li>Once data is fetched, we use the standard GraphQL node traversal to fetch <code>nodes</code> from result and display them on the page using a <code>{#each}</code> loop.</li>
<li>Catch any exceptions</li>
</ol>
<p>By now, you should see the to-do records fetched and displayed on the page.</p>
<p>Add a form element before or after the list displayed in the previous section. This comprises of just a single input box and a <code>submit</code> button.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">form</span> <span class="na">on:submit</span><span class="err">|</span><span class="na">preventDefault</span><span class="o">=</span><span class="s">&#34;{addTodo}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">input</span> <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;new todo&#34;</span> <span class="na">bind:value</span><span class="o">=</span><span class="s">&#34;{todoEdit}&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">button</span> <span class="na">method</span><span class="o">=</span><span class="s">&#34;submit&#34;</span><span class="p">&gt;</span>Submit<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Bind the input box to the (temporary) to-do variable we had declared earlier. We prevent default action on button click so that the page does not go into wild, unnecessary refresh.</p>
<p>And, there it is - your beautiful looking app that can insert or query to-do&rsquo;s.</p>
<p><img loading="lazy" src="/misc/svelte-graphql-todo-app.png" type="" alt="svelte-graphql-todo-app"  /></p>
<p>Your app can now insert to-do records and fetch those to-do&rsquo;s - what more can a human ask for?</p>
<h5 id="full-code-for-todosvelte">Full Code for <code>Todo.svelte</code></h5>
<p>Copy/paste was never made more easier (until next section - you can just clone the repository from Github).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">getClient</span><span class="p">,</span> <span class="nx">query</span><span class="p">,</span> <span class="nx">mutate</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;svelte-apollo&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">gql</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;apollo-boost&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">GETTODO</span> <span class="o">=</span> <span class="nx">gql</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">    {
</span></span></span><span class="line"><span class="cl"><span class="sb">      allTodos {
</span></span></span><span class="line"><span class="cl"><span class="sb">        nodes {
</span></span></span><span class="line"><span class="cl"><span class="sb">          id
</span></span></span><span class="line"><span class="cl"><span class="sb">          title
</span></span></span><span class="line"><span class="cl"><span class="sb">          done
</span></span></span><span class="line"><span class="cl"><span class="sb">        }
</span></span></span><span class="line"><span class="cl"><span class="sb">      }
</span></span></span><span class="line"><span class="cl"><span class="sb">    }
</span></span></span><span class="line"><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">ADDTODO</span> <span class="o">=</span> <span class="nx">gql</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb">    mutation($todoEdit: String!) {
</span></span></span><span class="line"><span class="cl"><span class="sb">      createTodo(input: { todo: { title: $todoEdit, done: false } }) {
</span></span></span><span class="line"><span class="cl"><span class="sb">        todo {
</span></span></span><span class="line"><span class="cl"><span class="sb">          id
</span></span></span><span class="line"><span class="cl"><span class="sb">          title
</span></span></span><span class="line"><span class="cl"><span class="sb">          done
</span></span></span><span class="line"><span class="cl"><span class="sb">        }
</span></span></span><span class="line"><span class="cl"><span class="sb">      }
</span></span></span><span class="line"><span class="cl"><span class="sb">    }
</span></span></span><span class="line"><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">todoEdit</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">getClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todoOp</span> <span class="o">=</span> <span class="nx">query</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="p">{</span> <span class="nx">query</span><span class="o">:</span> <span class="nx">GETTODO</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">function</span> <span class="nx">addTodo</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">todoAdd</span> <span class="o">=</span> <span class="nx">mutate</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">mutation</span><span class="o">:</span> <span class="nx">ADDTODO</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">variables</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">todoEdit</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span>
</span></span><span class="line"><span class="cl">      <span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">data</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">todoEdit</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">todoOp</span><span class="p">.</span><span class="nx">refetch</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">})</span>
</span></span><span class="line"><span class="cl">      <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">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">&#34;error: &#34;</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">done</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">line-through</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;text-align:center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h2</span><span class="p">&gt;</span>Svedos<span class="p">&lt;/</span><span class="nt">h2</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">form</span> <span class="na">on:submit</span><span class="err">|</span><span class="na">preventDefault</span><span class="o">=</span><span class="s">&#34;{addTodo}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">input</span> <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;new todo&#34;</span> <span class="na">bind:value</span><span class="o">=</span><span class="s">&#34;{todoEdit}&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">button</span> <span class="na">method</span><span class="o">=</span><span class="s">&#34;submit&#34;</span><span class="p">&gt;</span>Submit<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  {#await $todoOp}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>.. loading<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  {:then data} {#each data.data[&#39;allTodos&#39;][&#39;nodes&#39;] as todo, i}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class:done</span><span class="o">=</span><span class="s">&#34;{todo.done}&#34;</span><span class="p">&gt;</span>{todo.title}<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {/each} {:catch e} {e} {/await}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span></code></pre></div><h3 id="final-final-code">Final final code</h3>
<p>Find all <a href="https://github.com/techformist/svedo">code on GitHub</a></p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
