diff --git a/src/components/CreateMeritRequest.svelte b/src/components/CreateMeritRequest.svelte index 3e655fb..01d0419 100644 --- a/src/components/CreateMeritRequest.svelte +++ b/src/components/CreateMeritRequest.svelte @@ -14,6 +14,7 @@ import Todo from './Todo.svelte'; import { isValidUrl } from '@/event_helpers/rockets'; import CalculateSats from './CalculateSats.svelte'; + import { isGitHubUrl, parseProblem } from '@/helpers'; export let rocketEvent: NDKEvent; @@ -48,6 +49,14 @@ } } + $: if (isGitHubUrl(problem)) { + parseProblem(problem).then((title) => { + if (title) { + problem = `${title}\n\n${problem}`; + } + }); + } + function validateSolution(solution: string) { if (solution.length > 0) { return isValidUrl(solution); diff --git a/src/components/MeritRequestDashboard.svelte b/src/components/MeritRequestDashboard.svelte index db59fc5..359bced 100644 --- a/src/components/MeritRequestDashboard.svelte +++ b/src/components/MeritRequestDashboard.svelte @@ -28,11 +28,7 @@ - {#await parseProblem(merit.Problem())} - {merit.Problem().substring(0, 16)}{#if merit.Problem().length > 16}...{/if} - {:then parsed} - {parsed.substring(0, 16)}{#if parsed.length > 16}...{/if} - {/await} + {merit.Problem().substring(0, 16)}{#if merit.Problem().length > 16}...{/if} diff --git a/src/components/MeritRequests.svelte b/src/components/MeritRequests.svelte index 3d34a50..cd7791f 100644 --- a/src/components/MeritRequests.svelte +++ b/src/components/MeritRequests.svelte @@ -5,7 +5,7 @@ import * as Table from '@/components/ui/table'; import { MapOfMeritResult, MeritRequest } from '@/event_helpers/merits'; import { Rocket, RocketATagFilter } from '@/event_helpers/rockets'; - import { parseProblem, unixToRelativeTime } from '@/helpers'; + import { unixToRelativeTime } from '@/helpers'; import { ndk } from '@/ndk'; import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components'; @@ -115,11 +115,7 @@ {merit.Sats} {merit.Merits} diff --git a/src/components/MeritSummaryCard.svelte b/src/components/MeritSummaryCard.svelte index 2800239..c9e42a3 100644 --- a/src/components/MeritSummaryCard.svelte +++ b/src/components/MeritSummaryCard.svelte @@ -11,13 +11,7 @@ import { Separator } from '$lib/components/ui/separator/index.js'; import * as Table from '@/components/ui/table'; import { Rocket, RocketATagFilter } from '@/event_helpers/rockets'; - import { - formatReferenceTime, - getCuckPrice, - getRocketURL, - parseProblem, - unixToRelativeTime - } from '@/helpers'; + import { formatReferenceTime, getCuckPrice, getRocketURL, unixToRelativeTime } from '@/helpers'; import { derived } from 'svelte/store'; import { goto } from '$app/navigation'; @@ -123,11 +117,7 @@
- {#await parseProblem(merit.Problem())} - Problem: {merit.Problem().substring(0, 20)} - {:then parsed} - {parsed} - {/await} + {merit.Problem().split('\n')[0]} {#if merit.Solution()}View Solution { } export async function parseProblem(problem: string) { - try { - if (isGitHubIssueUrl(problem)) { - const apiURL = convertToGitHubApiUrl(problem); - if (!apiURL) { - return problem; - } - const response = await fetch(apiURL); - const json = await response.json(); - return json.title; - } else { - return problem; - } - } catch (error) { - console.error('Get title error:', error); - return problem; + if (!isGitHubUrl(problem)) { + return; } + + const apiURL = convertToGitHubApiUrl(problem); + if (!apiURL) { + return; + } + + const response = await fetch(apiURL); + if (!response.ok) { + return; + } + + const { title } = await response.json(); + return title; } -function isGitHubIssueUrl(url: string): boolean { +export function isGitHubUrl(str: string): boolean { + let url; try { - const parsedUrl: URL = new URL(url); - if (parsedUrl.hostname !== 'github.com') { - return false; - } - const pathParts: string[] = parsedUrl.pathname.split('/').filter((part) => part !== ''); - if (pathParts.length !== 4 || pathParts[2] !== 'issues' || !/^[1-9]\d*$/.test(pathParts[3])) { - return false; - } - return true; - } catch (error) { + url = new URL(str); + } catch { return false; } + const pathParts = url.pathname.split('/').filter(Boolean); + + if (url.hostname !== 'github.com') { + return false; + } + if (pathParts.length !== 4) { + return false; + } + if (!['issues', 'pull'].includes(pathParts[2])) { + return false; + } + if (!/^[1-9]\d*$/.test(pathParts[3])) { + return false; + } + return true; } -function convertToGitHubApiUrl(issueUrl: URL | string): URL | null { +function convertToGitHubApiUrl(issueUrl: string): URL | null { + const url = new URL(issueUrl); + const [owner, repo, , issueNumber] = url.pathname.split('/').filter(Boolean); try { - const url = new URL(issueUrl); - if (url.hostname !== 'github.com') { - throw new Error('Not a valid GitHub URL'); - } - const pathParts = url.pathname.split('/').filter((part) => part !== ''); - if (pathParts.length !== 4 || pathParts[2] !== 'issues') { - throw new Error('Not a valid GitHub issue URL'); - } - const [owner, repo, , issueNumber] = pathParts; + // Whether it's `issues` or `pull`, the API uses `issues` return new URL(`https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}`); } catch (error) { console.error('URL conversion error:', error);