Skip to content

Commit 91bf20e

Browse files
committed
components
1 parent 8d1e744 commit 91bf20e

File tree

6 files changed

+127
-107
lines changed

6 files changed

+127
-107
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
defmodule DiffWeb.DiffComponent do
2+
use DiffWeb, :live_component
3+
4+
def render(assigns) do
5+
~H"""
6+
<div class="ghd-file">
7+
<div class="ghd-file-header">
8+
<span class={"ghd-file-status ghd-file-status-#{diff_status(@diff)}"}>
9+
<%= diff_status(@diff) %>
10+
</span>
11+
<%= file_header(@diff, diff_status(@diff)) %>
12+
<span class="collapse-diff"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16"><path fill-rule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5 5 5z"/></svg></span>
13+
<span class="reveal-diff"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16"><path fill-rule="evenodd" d="M5 11L0 6l1.5-1.5L5 8.25 8.5 4.5 10 6l-5 5z"/></svg></span>
14+
</div>
15+
<div class="ghd-diff">
16+
<table class="ghd-diff">
17+
<%= for chunk <- @diff.chunks do %>
18+
<tr class="ghd-chunk-header">
19+
<td class="ghd-line-number">
20+
<div class="ghd-line-number-from">&nbsp;</div>
21+
<div class="ghd-line-number-to"></div>
22+
</td>
23+
<td class="ghd-text">
24+
<div class="ghd-text-internal"><%= chunk.header %></div>
25+
</td>
26+
</tr>
27+
<%= for line <- chunk.lines do %>
28+
<tr id={line_id(@diff, line)} class={"ghd-line ghd-line-type-#{line_type(line)}"}>
29+
<td class="ghd-line-number">
30+
<div class="ghd-line-number-from">
31+
<%= line_number(line.from_line_number) %>
32+
</div>
33+
<div class="ghd-line-number-to">
34+
<%= line_number(line.to_line_number) %>
35+
</div>
36+
</td>
37+
<td class="ghd-text">
38+
<div class="ghd-text-user"><%= line_text(line.text) %></div>
39+
</td>
40+
</tr>
41+
<% end %>
42+
<% end %>
43+
</table>
44+
</div>
45+
</div>
46+
"""
47+
end
48+
49+
defp file_header(diff, status) do
50+
from = diff.from
51+
to = diff.to
52+
53+
case status do
54+
"changed" -> from
55+
"renamed" -> "#{from} -> #{to}"
56+
"removed" -> from
57+
"added" -> to
58+
end
59+
end
60+
61+
defp diff_status(diff) do
62+
from = diff.from
63+
to = diff.to
64+
65+
cond do
66+
!from -> "added"
67+
!to -> "removed"
68+
from == to -> "changed"
69+
true -> "renamed"
70+
end
71+
end
72+
73+
defp line_number(ln) when is_nil(ln), do: ""
74+
defp line_number(ln), do: to_string(ln)
75+
76+
defp line_id(diff, line) do
77+
hash = :erlang.phash2({diff.from, diff.to})
78+
ln = "-#{line.from_line_number}-#{line.to_line_number}"
79+
[to_string(hash), ln]
80+
end
81+
82+
defp line_type(line), do: to_string(line.type)
83+
84+
defp line_text("+" <> text),
85+
do: [content_tag(:span, "+ ", class: "ghd-line-status"), content_tag(:span, text)]
86+
87+
defp line_text("-" <> text),
88+
do: [content_tag(:span, "- ", class: "ghd-line-status"), content_tag(:span, text)]
89+
90+
defp line_text(" " <> text),
91+
do: [content_tag(:span, " ", class: "ghd-line-status"), content_tag(:span, text)]
92+
93+
defp line_text(text), do: [content_tag(:span, text)]
94+
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
defmodule DiffWeb.TooLargeComponent do
2+
use DiffWeb, :live_component
3+
4+
def render(assigns) do
5+
~H"""
6+
<div class="ghd-file">
7+
<div class="ghd-file-header">
8+
<span class="ghd-file-status">
9+
unknown
10+
</span>
11+
<%= @file %>
12+
<span class="collapse-diff"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16"><path fill-rule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5 5 5z"/></svg></span>
13+
<span class="reveal-diff"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16"><path fill-rule="evenodd" d="M5 11L0 6l1.5-1.5L5 8.25 8.5 4.5 10 6l-5 5z"/></svg></span>
14+
</div>
15+
<div class="ghd-diff ghd-diff-error">
16+
CANNOT RENDER FILES LARGER THAN 1MB
17+
</div>
18+
</div>
19+
"""
20+
end
21+
end

lib/diff_web/templates/render/diff.html.eex

Lines changed: 0 additions & 41 deletions
This file was deleted.

lib/diff_web/templates/render/too_large.html.eex

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib/diff_web/views/live_view.ex

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ defmodule DiffWeb.LiveView do
88
# Parse the stored content based on format
99
case Jason.decode(raw_content) do
1010
{:ok, %{"type" => "too_large", "file" => file_path}} ->
11-
Phoenix.View.render_to_string(DiffWeb.RenderView, "too_large.html", file: file_path)
11+
rendered = DiffWeb.TooLargeComponent.render(%{file: file_path})
12+
13+
rendered.static
14+
|> Enum.zip_with(rendered.dynamic.(true), fn static, dynamic -> [static, dynamic] end)
15+
|> IO.iodata_to_binary()
1216
|> sanitize_utf8()
1317

1418
{:ok, %{"diff" => raw_diff, "path_from" => path_from, "path_to" => path_to}} ->
@@ -20,7 +24,13 @@ defmodule DiffWeb.LiveView do
2024
# Take the first diff (should only be one per file)
2125
diff = List.first(diffs)
2226

23-
Phoenix.View.render_to_string(DiffWeb.RenderView, "diff.html", diff: diff)
27+
rendered = DiffWeb.DiffComponent.render(%{diff: diff})
28+
29+
rendered.static
30+
|> Enum.zip_with(rendered.dynamic.(true), fn static, dynamic ->
31+
[static, dynamic]
32+
end)
33+
|> IO.iodata_to_binary()
2434
|> sanitize_utf8()
2535

2636
{:error, reason} ->

lib/diff_web/views/render_view.ex

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)