From ba32f4e8f7a8ae285732aed2f0fb9065b5fa9e72 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Fri, 31 Jan 2025 18:31:35 -0600 Subject: [PATCH] Refactor GitHub fork status behavior --- __tests__/html.test.ts | 6 ++- src/admin/github/GitHubForkStatusBadge.tsx | 10 ++-- .../github/GitHubForkStatusBadgeClient.tsx | 3 +- .../github/GitHubForkStatusBadgeServer.tsx | 18 ++++--- src/admin/github/index.ts | 50 ++++++++++++------- src/site/config.ts | 12 +++-- tailwind.config.js | 2 +- 7 files changed, 61 insertions(+), 40 deletions(-) diff --git a/__tests__/html.test.ts b/__tests__/html.test.ts index 9468d976..d9eda9b1 100644 --- a/__tests__/html.test.ts +++ b/__tests__/html.test.ts @@ -1,5 +1,7 @@ -import { htmlHasBrParagraphBreaks, safelyParseFormattedHtml } from '@/utility/html'; -import { parameterize } from '@/utility/string'; +import { + htmlHasBrParagraphBreaks, + safelyParseFormattedHtml, +} from '@/utility/html'; describe('HTML', () => { it('safely parses', () => { diff --git a/src/admin/github/GitHubForkStatusBadge.tsx b/src/admin/github/GitHubForkStatusBadge.tsx index f4cb64f7..e9cd6263 100644 --- a/src/admin/github/GitHubForkStatusBadge.tsx +++ b/src/admin/github/GitHubForkStatusBadge.tsx @@ -1,14 +1,12 @@ import { Suspense } from 'react'; import GitHubForkStatusBadgeClient from './GitHubForkStatusBadgeClient'; import GitHubForkStatusBadgeServer from './GitHubForkStatusBadgeServer'; -import { IS_DEVELOPMENT, IS_VERCEL_GIT_PROVIDER_GITHUB } from '@/site/config'; +import { IS_DEVELOPMENT } from '@/site/config'; export default function GitHubForkStatusBadge() { return IS_DEVELOPMENT ? - : IS_VERCEL_GIT_PROVIDER_GITHUB - ? - - - : null; + : + + ; } diff --git a/src/admin/github/GitHubForkStatusBadgeClient.tsx b/src/admin/github/GitHubForkStatusBadgeClient.tsx index 7bf89811..eaf5323a 100644 --- a/src/admin/github/GitHubForkStatusBadgeClient.tsx +++ b/src/admin/github/GitHubForkStatusBadgeClient.tsx @@ -38,10 +38,11 @@ export default function GitHubForkStatusBadgeClient({ }; const className = clsx( + 'opacity-0 transition-opacity animate-fade-in', 'inline-flex items-center gap-2', 'border transition-colors', url ? 'hover:underline' : 'select-none', - 'pl-[4.5px] pr-2 py-[3px]', + 'pl-[4.5px] pr-2.5 py-[3px]', 'rounded-full shadow-sm', classNameForStyle(), ); diff --git a/src/admin/github/GitHubForkStatusBadgeServer.tsx b/src/admin/github/GitHubForkStatusBadgeServer.tsx index 44bb8dc8..39669026 100644 --- a/src/admin/github/GitHubForkStatusBadgeServer.tsx +++ b/src/admin/github/GitHubForkStatusBadgeServer.tsx @@ -1,5 +1,6 @@ import GitHubForkStatusBadgeClient from './GitHubForkStatusBadgeClient'; import { + VERCEL_GIT_BRANCH, VERCEL_GIT_REPO_OWNER, VERCEL_GIT_REPO_SLUG, } from '@/site/config'; @@ -8,29 +9,32 @@ import { getGitHubMeta } from '.'; export default async function GitHubForkStatusBadgeServer() { const owner = VERCEL_GIT_REPO_OWNER; const repo = VERCEL_GIT_REPO_SLUG; - + const branch = VERCEL_GIT_BRANCH; + const { url, + isForkedFromBase, label, title, isBehind, - } = await getGitHubMeta({ owner, repo }) + } = await getGitHubMeta({ owner, repo, branch }) .catch(() => { - console.log('Error getting GitHub meta', { owner, repo }); + console.error('Error retrieving GitHub meta', { owner, repo, branch }); return { url: undefined, + isForkedFromBase: false, label: undefined, title: undefined, - isBehind: false, + isBehind: undefined, }; }); - return ( - - ); + : null; } diff --git a/src/admin/github/index.ts b/src/admin/github/index.ts index fe662cc8..fbad31d0 100644 --- a/src/admin/github/index.ts +++ b/src/admin/github/index.ts @@ -1,7 +1,10 @@ -import { VERCEL_BRANCH } from '@/site/config'; +import { + TEMPLATE_BASE_OWNER, + TEMPLATE_BASE_REPO, + TEMPLATE_BASE_BRANCH, +} from '@/site/config'; -const BASE_OWNER = 'sambecker'; -const BASE_REPO = 'exif-photo-blog'; +const DEFAULT_BRANCH = 'main'; interface RepoParams { owner?: string @@ -9,31 +12,42 @@ interface RepoParams { branch?: string }; -// Urls +// Website urls const getGitHubRepoUrl = ({ - owner = BASE_OWNER, - repo = BASE_REPO, + owner = TEMPLATE_BASE_OWNER, + repo = TEMPLATE_BASE_REPO, }: RepoParams = {}) => `https://github.com/${owner}/${repo}`; +export const getGitHubCompareUrl = ({ + owner, + repo, + branch = DEFAULT_BRANCH, +}: RepoParams = {}) => + // eslint-disable-next-line max-len + `${getGitHubRepoUrl({ owner, repo })}/compare/${branch}...${TEMPLATE_BASE_OWNER}:${TEMPLATE_BASE_REPO}:${TEMPLATE_BASE_BRANCH}`; + +// API urls + const getGitHubApiRepoUrl = ({ - owner = BASE_OWNER, - repo = BASE_REPO, + owner = TEMPLATE_BASE_OWNER, + repo = TEMPLATE_BASE_REPO, }: RepoParams = {}) => `https://api.github.com/repos/${owner}/${repo}`; const getGitHubApiCommitsUrl = (params?: RepoParams) => `${getGitHubApiRepoUrl(params)}/commits/main`; -// Fetching - const getGitHubApiCompareUrl = ({ owner, repo, branch = 'main', }: RepoParams = {}) => - `${getGitHubApiRepoUrl()}/compare/main...${owner}:${repo}:${branch}`; + // eslint-disable-next-line max-len + `${getGitHubApiRepoUrl()}/compare/${TEMPLATE_BASE_BRANCH}...${owner}:${repo}:${branch}`; + +// Requests const getLatestBaseRepoCommitSha = async () => { const response = await fetch(getGitHubApiCommitsUrl()); @@ -44,21 +58,21 @@ const getLatestBaseRepoCommitSha = async () => { const getIsRepoForkedFromBase = async (params: RepoParams) => { const response = await fetch(getGitHubApiRepoUrl(params)); const data = await response.json(); - return data.fork && data.source?.full_name === `${BASE_OWNER}/${BASE_REPO}`; + return ( + Boolean(data.fork) && + data.source?.full_name === `${TEMPLATE_BASE_OWNER}/${TEMPLATE_BASE_REPO}` + ); }; const getGitHubCommitsBehind = async (params?: RepoParams) => { - const response = await fetch(getGitHubApiCompareUrl({ - ...params, - branch: VERCEL_BRANCH, - })); + const response = await fetch(getGitHubApiCompareUrl(params)); const data = await response.json(); return data.behind_by as number; }; const isRepoBaseRepo = async ({ owner, repo }: RepoParams) => - owner?.toLowerCase() === BASE_OWNER && - repo?.toLowerCase() === BASE_REPO; + owner?.toLowerCase() === TEMPLATE_BASE_OWNER && + repo?.toLowerCase() === TEMPLATE_BASE_REPO; export const getGitHubMeta = async (params: RepoParams) => { const [ diff --git a/src/site/config.ts b/src/site/config.ts index a73b9a49..4be0edc7 100644 --- a/src/site/config.ts +++ b/src/site/config.ts @@ -3,23 +3,26 @@ import type { StorageType } from '@/services/storage'; import { makeUrlAbsolute, shortenUrl } from '@/utility/url'; // HARD-CODED GLOBAL CONFIGURATION - export const SHOULD_PREFETCH_ALL_LINKS: boolean | undefined = undefined; export const SHOULD_DEBUG_SQL = false; // META / SOURCE / DOMAINS - export const SITE_TITLE = process.env.NEXT_PUBLIC_SITE_TITLE || 'Photo Blog'; // SOURCE +export const TEMPLATE_BASE_OWNER = 'sambecker'; +export const TEMPLATE_BASE_REPO = 'exif-photo-blog'; +export const TEMPLATE_BASE_BRANCH = 'main'; + export const VERCEL_GIT_PROVIDER = process.env.NEXT_PUBLIC_VERCEL_GIT_PROVIDER; export const VERCEL_GIT_REPO_OWNER = process.env.NEXT_PUBLIC_VERCEL_GIT_REPO_OWNER; export const VERCEL_GIT_REPO_SLUG = process.env.NEXT_PUBLIC_VERCEL_GIT_REPO_SLUG; +export const VERCEL_GIT_BRANCH = process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_REF; export const VERCEL_GIT_COMMIT_MESSAGE = process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_MESSAGE; export const VERCEL_GIT_COMMIT_SHA = @@ -37,10 +40,9 @@ export const VERCEL_ENV = process.env.NEXT_PUBLIC_VERCEL_ENV; export const VERCEL_PRODUCTION_URL = process.env.VERCEL_PROJECT_PRODUCTION_URL; export const VERCEL_DEPLOYMENT_URL = process.env.NEXT_PUBLIC_VERCEL_URL; export const VERCEL_BRANCH_URL = process.env.NEXT_PUBLIC_VERCEL_BRANCH_URL; -export const VERCEL_BRANCH = process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_REF; // Last resort: cannot be used reliably -export const VERCEL_PROJECT_URL = VERCEL_BRANCH_URL && VERCEL_BRANCH - ? `${VERCEL_BRANCH_URL.split(`-git-${VERCEL_BRANCH}-`)[0]}.vercel.app` +export const VERCEL_PROJECT_URL = VERCEL_BRANCH_URL && VERCEL_GIT_BRANCH + ? `${VERCEL_BRANCH_URL.split(`-git-${VERCEL_GIT_BRANCH}-`)[0]}.vercel.app` : undefined; export const IS_PRODUCTION = process.env.NODE_ENV === 'production' && ( diff --git a/tailwind.config.js b/tailwind.config.js index a728d01d..889d2572 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -29,7 +29,7 @@ module.exports = { 'rotate-pulse': 'rotate-pulse 0.75s linear infinite normal both running', 'fade-in': - 'fade-in 0.5s linear', + 'fade-in 0.5s linear both running', 'hover-drift': 'hover-drift 8s linear infinite', 'hover-wobble':