livebook / public-apps /smart_cells.livemd
hugobarauna's picture
Adds a spinner
0664a8c verified
raw
history blame contribute delete
No virus
2.52 kB
<!-- livebook:{"app_settings":{"access_type":"public","auto_shutdown_ms":3600000,"output_type":"rich","show_source":true,"slug":"livebook-smart-cells-list","zero_downtime":true}} -->
# List of Livebook Smart Cells on Github
```elixir
Mix.install([
{:kino, "~> 0.12"},
{:req, "~> 0.4"},
{:req_github_paginate, github: "acalejos/req_github_paginate"}
])
```
## Section
```elixir
defmodule Kino.Spinner do
def new() do
Kino.HTML.new("""
<div class="loader"></div>
<style>
.loader {
border: 16px solid #f3f3f3; /* Light grey */
border-top: 16px solid #3498db; /* Blue */
border-radius: 50%;
width: 30px;
height: 30px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
""")
end
end
```
```elixir
defmodule GitHubAPI do
def headers(),
do: %{
"Accept" => "application/vnd.github+json",
"Authorization" => "Bearer #{System.fetch_env!("LB_GITHUB_TOKEN")}",
"X-GitHub-Api-Version" => "2022-11-28"
}
def params(),
do: [
q: "use Kino.SmartCell in:file language:elixir",
per_page: 100,
page: 1
]
def new() do
Req.new(base_url: "https://api.github.com") |> ReqGitHubPaginate.attach()
end
def _get_all(request, params) do
resp =
Req.get!(
request,
url: "/search/code",
params: params,
headers: headers()
)
if Keyword.has_key?(resp.headers["link"], :next) do
{_, params} = Map.pop(resp.headers["link"][:next], "url")
resp.body["items"] ++ _get_all(request, params)
else
resp.body["items"]
end
end
def get_all(request) do
_get_all(request, params())
end
end
```
```elixir
frame = Kino.Frame.new() |> Kino.render()
Kino.Frame.append(frame, Kino.Spinner.new())
```
```elixir
items = GitHubAPI.new() |> GitHubAPI.get_all()
nil
```
```elixir
table =
for repo <- items, repo["repository"]["owner"]["login"] != "livebook-dev" do
%{
"Name" => repo["repository"]["name"],
"Description" => repo["repository"]["description"],
"URL" => repo["repository"]["html_url"]
}
end
|> Kino.DataTable.new(name: "Smart cells")
Kino.Frame.render(frame, table)
```
<!-- livebook:{"offset":2330,"stamp":{"token":"XCP.M4F9Mu9JmVN3zo1H252A6D_XZK0YF0q6oNOcG5Ddz3jQuIiKPSiqgM0qdcv3ETVMC5DzgJA0o9GSnps38eVzGwJNhy27ZAr3o9Junmz98dkNvYcBQAiJ","version":2}} -->