diff --git a/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex b/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex index 8320360..5fd67d6 100644 --- a/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex +++ b/apps/lol_analytics/lib/lol_analytics/facts/champion_played_game/champion_played_game_repo.ex @@ -51,7 +51,8 @@ defmodule LolAnalytics.Facts.ChampionPlayedGame.Repo do end end - defp get_all_win_rates do + @spec champion_win_rates_by_patch(String.t(), String.t()) :: [map()] + def champion_win_rates_by_patch(champion_id, team_position) do query = from m in Schema, join: c in ChampionSchema, @@ -66,13 +67,15 @@ defmodule LolAnalytics.Facts.ChampionPlayedGame.Repo do m.is_win ), id: m.champion_id, + patch_number: m.patch_number, name: c.name, image: c.image, team_position: m.team_position, total_games: count("*") }, - group_by: [m.champion_id, c.image, c.name, m.team_position], - having: count("*") > 100 + group_by: [m.champion_id, c.image, c.name, m.patch_number, m.team_position], + where: m.team_position == ^team_position and m.champion_id == ^champion_id, + having: count("*") > 50 Repo.all(query) end diff --git a/apps/lol_analytics_web/assets/js/app.js b/apps/lol_analytics_web/assets/js/app.js index d5e278a..1221d25 100644 --- a/apps/lol_analytics_web/assets/js/app.js +++ b/apps/lol_analytics_web/assets/js/app.js @@ -18,18 +18,22 @@ // Include phoenix_html to handle method=PUT/DELETE in forms and buttons. import "phoenix_html" // Establish Phoenix Socket and LiveView configuration. -import {Socket} from "phoenix" -import {LiveSocket} from "phoenix_live_view" +import { Socket } from "phoenix" +import { LiveSocket } from "phoenix_live_view" import topbar from "../vendor/topbar" +import { ChampionWinRate } from "./hooks/champion_win_rate_patch" let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") let liveSocket = new LiveSocket("/live", Socket, { longPollFallbackMs: 2500, - params: {_csrf_token: csrfToken} + params: { _csrf_token: csrfToken }, + hooks: { + ChampionWinRate, + } }) // Show progress bar on live navigation and form submits -topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"}) +topbar.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" }) window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) diff --git a/apps/lol_analytics_web/assets/js/hooks/champion_win_rate_patch.js b/apps/lol_analytics_web/assets/js/hooks/champion_win_rate_patch.js new file mode 100644 index 0000000..0d0be18 --- /dev/null +++ b/apps/lol_analytics_web/assets/js/hooks/champion_win_rate_patch.js @@ -0,0 +1,38 @@ +import Chart from "chart.js/auto" + +const ChampionWinRate = { + mounted() { + console.log("mounted") + this.handleEvent("points", (event) => console.log("123")) + + // this.props = { id: this.el.getAttribute("data-id") }; + this.handleEvent("win-rate", ({ winRates }) => { + console.log(">>>>>>>") + console.log(winRates); + patches = winRates.map((winRate) => { + return winRate.patch_number + }) + winRateValues = winRates.map((winRate) => winRate.win_rate) + setInterval(() => { + const data = { + labels: patches, + datasets: [{ + label: 'Win rate', + data: winRateValues, + fill: false, + borderColor: 'rgb(75, 192, 192)', + tension: 0.1 + }] + }; + this.chart = new Chart(document.getElementById("win-rate"), { + type: 'line', + data: data + }) + this.chart.canvas.parentNode.style.height = '250px'; + this.chart.canvas.parentNode.style.width = '400px'; + }, 1000) + }); + } +} + +export { ChampionWinRate }; \ No newline at end of file diff --git a/apps/lol_analytics_web/assets/package-lock.json b/apps/lol_analytics_web/assets/package-lock.json new file mode 100644 index 0000000..9ba8d1e --- /dev/null +++ b/apps/lol_analytics_web/assets/package-lock.json @@ -0,0 +1,28 @@ +{ + "name": "assets", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "chart.js": "^4.4.3" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + } + } +} diff --git a/apps/lol_analytics_web/assets/package.json b/apps/lol_analytics_web/assets/package.json new file mode 100644 index 0000000..73f9792 --- /dev/null +++ b/apps/lol_analytics_web/assets/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "chart.js": "^4.4.3" + } +} diff --git a/apps/lol_analytics_web/lib/lol_analytics_web/components/champion_components/champion_avatar.ex b/apps/lol_analytics_web/lib/lol_analytics_web/components/champion_components/champion_avatar.ex index cd13004..323fe93 100644 --- a/apps/lol_analytics_web/lib/lol_analytics_web/components/champion_components/champion_avatar.ex +++ b/apps/lol_analytics_web/lib/lol_analytics_web/components/champion_components/champion_avatar.ex @@ -4,11 +4,19 @@ defmodule LolAnalyticsWeb.ChampionComponents.ChampionAvatar do attr :id, :integer, required: true attr :image, :string, required: true attr :name, :string, required: true + attr :width, :integer, default: 100 + attr :height, :integer, default: 100 def champion_avatar(assigns) do ~H""" +