diff --git a/api/wakatime.js b/api/wakatime.js index d439c5b7ac8c6..7ae93b5799321 100644 --- a/api/wakatime.js +++ b/api/wakatime.js @@ -28,7 +28,6 @@ export default async (req, res) => { langs_count, hide, api_domain, - range, border_radius, border_color, } = req.query; @@ -40,7 +39,7 @@ export default async (req, res) => { } try { - const stats = await fetchWakatimeStats({ username, api_domain, range }); + const stats = await fetchWakatimeStats({ username, api_domain }); let cacheSeconds = clampValue( parseInt(cache_seconds || CONSTANTS.FOUR_HOURS, 10), diff --git a/readme.md b/readme.md index dc60369751a27..e7ef2b7096b5c 100644 --- a/readme.md +++ b/readme.md @@ -315,7 +315,6 @@ You can provide multiple comma-separated values in the bg_color option to render - `layout` - Switch between two available layouts `default` & `compact`. Default `default`. - `langs_count` - Limit the number of languages on the card, defaults to all reported languages _(number)_. - `api_domain` - Set a custom API domain for the card, e.g. to use services like [Hakatime](https://github.com/mujx/hakatime) or [Wakapi](https://github.com/muety/wakapi) _(string)_. Default `Waka API`. -- `range` – Request a range different from your WakaTime default, e.g. `last_7_days`. See [WakaTime API docs](https://wakatime.com/developers#stats) for a list of available options. _(YYYY-MM, last_7_days, last_30_days, last_6_months, last_year, or all_time)_. Default `all_time`. * * * @@ -468,15 +467,15 @@ You can use the `&hide_progress=true` option to hide the percentages and the pro # Wakatime Week Stats +> **Warning** +> Please be aware that we currently only show data from Wakatime profiles that are public. You therefore have to make sure that **BOTH** `Display code time publicly` and `Display languages, editors, os, categories publicly` are enabled. + Change the `?username=` value to your [Wakatime](https://wakatime.com) username. ```md [![Harlok's wakatime stats](https://github-readme-stats.vercel.app/api/wakatime?username=Harlok)](https://github.com/anuraghazra/github-readme-stats) ``` -> **Note**: -> Please be aware that we currently only show data from Wakatime profiles that are public. - ### Demo [![Harlok's wakatime stats](https://github-readme-stats.vercel.app/api/wakatime?username=Harlok)](https://github.com/anuraghazra/github-readme-stats) diff --git a/src/cards/wakatime-card.js b/src/cards/wakatime-card.js index dacc4227dc2ad..9c17a4c063db7 100644 --- a/src/cards/wakatime-card.js +++ b/src/cards/wakatime-card.js @@ -279,7 +279,11 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { : noCodingActivityNode({ // @ts-ignore color: textColor, - text: i18n.t("wakatimecard.nocodingactivity"), + text: !stats.is_coding_activity_visible + ? i18n.t("wakatimecard.notpublic") + : stats.is_other_usage_visible + ? i18n.t("wakatimecard.nocodingactivity") + : i18n.t("wakatimecard.nocodedetails"), }) } `; @@ -304,7 +308,11 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { noCodingActivityNode({ // @ts-ignore color: textColor, - text: i18n.t("wakatimecard.nocodingactivity"), + text: !stats.is_coding_activity_visible + ? i18n.t("wakatimecard.notpublic") + : stats.is_other_usage_visible + ? i18n.t("wakatimecard.nocodingactivity") + : i18n.t("wakatimecard.nocodedetails"), }), ], gap: lheight, @@ -312,9 +320,20 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { }).join(""); } + // Get title range text + let titleText = i18n.t("wakatimecard.title"); + switch (stats.range) { + case "last_7_days": + titleText += ` (${i18n.t("wakatimecard.last7days")})`; + break; + case "last_year": + titleText += ` (${i18n.t("wakatimecard.lastyear")})`; + break; + } + const card = new Card({ customTitle: custom_title, - defaultTitle: i18n.t("wakatimecard.title"), + defaultTitle: titleText, width: 495, height, border_radius, diff --git a/src/common/utils.js b/src/common/utils.js index 47e106140b6d0..d58203be69508 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -305,6 +305,7 @@ const SECONDARY_ERROR_MESSAGES = { "Please add an env variable called PAT_1 with your github token in vercel", USER_NOT_FOUND: "Make sure the provided username is not an organization", GRAPHQL_ERROR: "Please try again later", + WAKATIME_USER_NOT_FOUND: "Make sure you have a public WakaTime profile", }; /** @@ -324,6 +325,7 @@ class CustomError extends Error { static MAX_RETRY = "MAX_RETRY"; static USER_NOT_FOUND = "USER_NOT_FOUND"; static GRAPHQL_ERROR = "GRAPHQL_ERROR"; + static WAKATIME_ERROR = "WAKATIME_ERROR"; } /** diff --git a/src/fetchers/wakatime-fetcher.js b/src/fetchers/wakatime-fetcher.js index 2af8fa9998fb1..4578b9eb0ddda 100644 --- a/src/fetchers/wakatime-fetcher.js +++ b/src/fetchers/wakatime-fetcher.js @@ -1,29 +1,29 @@ import axios from "axios"; -import { MissingParamError } from "../common/utils.js"; +import { CustomError, MissingParamError } from "../common/utils.js"; +import { I18n } from "../common/I18n.js"; /** * WakaTime data fetcher. * - * @param {{username: string, api_domain: string, range: string}} props Fetcher props. + * @param {{username: string, api_domain: string }} props Fetcher props. * @returns {Promise} WakaTime data response. */ -const fetchWakatimeStats = async ({ username, api_domain, range }) => { +const fetchWakatimeStats = async ({ username, api_domain }) => { if (!username) throw new MissingParamError(["username"]); try { const { data } = await axios.get( `https://${ api_domain ? api_domain.replace(/\/$/gi, "") : "wakatime.com" - }/api/v1/users/${username}/stats/${ - range || "all_time" - }?is_including_today=true`, + }/api/v1/users/${username}/stats?is_including_today=true`, ); return data.data; } catch (err) { if (err.response.status < 200 || err.response.status > 299) { - throw new Error( - "Wakatime user not found, make sure you have a wakatime profile", + throw new CustomError( + `Could not resolve to a User with the login of '${username}'`, + "WAKATIME_USER_NOT_FOUND", ); } throw err; diff --git a/src/translations.js b/src/translations.js index 51fc6aaa4cb92..c123eb346f0bd 100644 --- a/src/translations.js +++ b/src/translations.js @@ -356,6 +356,22 @@ const wakatimeCardLocales = { vi: "Thống Kê Wakatime", se: "Wakatime statistik", }, + "wakatimecard.lastyear": { + en: "last year", + cn: "去年", + }, + "wakatimecard.last7days": { + en: "last 7 days", + cn: "最近 7 天", + }, + "wakatimecard.notpublic": { + en: "Wakatime user profile not public", + cn: "Wakatime 用户个人资料未公开", + }, + "wakatimecard.nocodedetails": { + en: "User doesn't publicly share detailed code statistics", + cn: "用户不公开分享详细的代码统计信息", + }, "wakatimecard.nocodingactivity": { ar: "لا يوجد نشاط برمجي لهذا الأسبوع", cn: "本周没有编程活动", diff --git a/tests/__snapshots__/renderWakatimeCard.test.js.snap b/tests/__snapshots__/renderWakatimeCard.test.js.snap index 6dfaf98e9742a..055c0f6642a7a 100644 --- a/tests/__snapshots__/renderWakatimeCard.test.js.snap +++ b/tests/__snapshots__/renderWakatimeCard.test.js.snap @@ -123,7 +123,7 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1 y="0" class="header" data-testid="header" - >Wakatime Stats + >Wakatime Stats (last 7 days) @@ -303,7 +303,7 @@ exports[`Test Render Wakatime Card should render correctly with compact layout w y="0" class="header" data-testid="header" - >Wakatime Stats + >Wakatime Stats (last 7 days) diff --git a/tests/e2e/e2e.test.js b/tests/e2e/e2e.test.js index f34859d4c8be0..91399a2a29b85 100644 --- a/tests/e2e/e2e.test.js +++ b/tests/e2e/e2e.test.js @@ -54,7 +54,7 @@ const WAKATIME_DATA = { is_up_to_date: false, is_up_to_date_pending_future: false, percent_calculated: 0, - range: "last_7_days", + range: "all_time", status: "pending_update", timeout: 15, username: USER, diff --git a/tests/fetchWakatime.test.js b/tests/fetchWakatime.test.js index 04c01ba42c6f0..964b37dcd1092 100644 --- a/tests/fetchWakatime.test.js +++ b/tests/fetchWakatime.test.js @@ -105,7 +105,7 @@ describe("Wakatime fetcher", () => { const username = "anuraghazra"; mock .onGet( - `https://wakatime.com/api/v1/users/${username}/stats/all_time?is_including_today=true`, + `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`, ) .reply(200, wakaTimeData); diff --git a/tests/renderWakatimeCard.test.js b/tests/renderWakatimeCard.test.js index 630f259643c78..7553277f60bac 100644 --- a/tests/renderWakatimeCard.test.js +++ b/tests/renderWakatimeCard.test.js @@ -43,7 +43,7 @@ describe("Test Render Wakatime Card", () => { expect( document.querySelector('g[transform="translate(0, 0)"]>text.stat.bold') .textContent, - ).toBe("本周没有编程活动"); + ).toBe("Wakatime 用户个人资料未公开"); }); it("should render without rounding", () => {