2 Commits

Author SHA1 Message Date
Felipe Coutinho
9456aa98bc fix(ci): passar NEXT_PUBLIC_LOGO_DEV_TOKEN como build arg no Docker
NEXT_PUBLIC_* é inlined pelo Next.js em build time — a variável precisa
ser injetada via ARG no Dockerfile e build-args no workflow do CI.
Sem isso, o token fica undefined e os logos nunca são exibidos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 01:06:23 +00:00
Felipe Coutinho
21c6a8d9d0 fix(lint): corrigir schema biome.json e formatação de imports
- biome.json: bump schema 2.4.10 → 2.4.11
- establishment-logo-picker.tsx, establishment-logo.tsx, navigation-menu.tsx, logo/index.ts: organizar imports e ajustar formatação conforme Biome 2.4.11

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 00:31:46 +00:00
7 changed files with 18 additions and 14 deletions

View File

@@ -85,6 +85,8 @@ jobs:
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: |
NEXT_PUBLIC_LOGO_DEV_TOKEN=${{ secrets.NEXT_PUBLIC_LOGO_DEV_TOKEN }}
- name: Image digest - name: Image digest
run: echo ${{ steps.meta.outputs.digest }} run: echo ${{ steps.meta.outputs.digest }}

View File

@@ -40,6 +40,10 @@ COPY --from=deps /app/public/pdf.worker.min.mjs ./public/pdf.worker.min.mjs
ENV NEXT_TELEMETRY_DISABLED=1 \ ENV NEXT_TELEMETRY_DISABLED=1 \
NODE_ENV=production NODE_ENV=production
# Token público do Logo.dev — injetado em build time (NEXT_PUBLIC_* é inlined pelo Next.js)
ARG NEXT_PUBLIC_LOGO_DEV_TOKEN
ENV NEXT_PUBLIC_LOGO_DEV_TOKEN=$NEXT_PUBLIC_LOGO_DEV_TOKEN
# Build da aplicação Next.js # Build da aplicação Next.js
RUN pnpm build RUN pnpm build

View File

@@ -1,5 +1,5 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.4.10/schema.json", "$schema": "https://biomejs.dev/schemas/2.4.11/schema.json",
"vcs": { "vcs": {
"enabled": true, "enabled": true,
"clientKind": "git", "clientKind": "git",

View File

@@ -9,11 +9,7 @@ import {
PopoverTrigger, PopoverTrigger,
} from "@/shared/components/ui/popover"; } from "@/shared/components/ui/popover";
import { Spinner } from "@/shared/components/ui/spinner"; import { Spinner } from "@/shared/components/ui/spinner";
import { import { buildLogoDevUrl, logoQueryKeys, toNameKey } from "@/shared/lib/logo";
buildLogoDevUrl,
logoQueryKeys,
toNameKey,
} from "@/shared/lib/logo";
import { import {
removeEstablishmentLogoAction, removeEstablishmentLogoAction,
saveEstablishmentLogoAction, saveEstablishmentLogoAction,
@@ -84,7 +80,9 @@ export function EstablishmentLogoPicker({
function handleSelect(domain: string) { function handleSelect(domain: string) {
startTransition(async () => { startTransition(async () => {
await saveEstablishmentLogoAction(name, domain); await saveEstablishmentLogoAction(name, domain);
queryClient.setQueryData(logoQueryKeys.mapping(toNameKey(name)), { domain }); queryClient.setQueryData(logoQueryKeys.mapping(toNameKey(name)), {
domain,
});
onSelect(domain); onSelect(domain);
}); });
} }
@@ -128,7 +126,8 @@ export function EstablishmentLogoPicker({
onClick={handleReset} onClick={handleReset}
className={cn( className={cn(
"flex flex-col items-center gap-1 rounded-md p-1.5 text-center transition-colors hover:bg-accent disabled:opacity-50", "flex flex-col items-center gap-1 rounded-md p-1.5 text-center transition-colors hover:bg-accent disabled:opacity-50",
resolvedDomain === null && "ring-2 ring-primary ring-offset-1", resolvedDomain === null &&
"ring-2 ring-primary ring-offset-1",
)} )}
title="Usar iniciais coloridas" title="Usar iniciais coloridas"
> >
@@ -157,7 +156,8 @@ export function EstablishmentLogoPicker({
onClick={() => handleSelect(r.domain)} onClick={() => handleSelect(r.domain)}
className={cn( className={cn(
"flex flex-col items-center gap-1 rounded-md p-1.5 text-center transition-colors hover:bg-accent disabled:opacity-50", "flex flex-col items-center gap-1 rounded-md p-1.5 text-center transition-colors hover:bg-accent disabled:opacity-50",
resolvedDomain === r.domain && "ring-2 ring-primary ring-offset-1", resolvedDomain === r.domain &&
"ring-2 ring-primary ring-offset-1",
)} )}
title={r.name} title={r.name}
> >

View File

@@ -4,8 +4,8 @@ import { RiPencilLine } from "@remixicon/react";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { import {
LOGO_DEV_TOKEN,
buildLogoDevUrl, buildLogoDevUrl,
LOGO_DEV_TOKEN,
logoQueryKeys, logoQueryKeys,
toNameKey, toNameKey,
} from "@/shared/lib/logo"; } from "@/shared/lib/logo";

View File

@@ -1,6 +1,6 @@
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
import { RiArrowDropDownLine } from "@remixicon/react"; import { RiArrowDropDownLine } from "@remixicon/react";
import { cva } from "class-variance-authority"; import { cva } from "class-variance-authority";
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
import type * as React from "react"; import type * as React from "react";
import { cn } from "@/shared/utils"; import { cn } from "@/shared/utils";

View File

@@ -48,9 +48,7 @@ export const toNameKey = (name: string): string => name.trim().toLowerCase();
export const LOGO_DEV_TOKEN = process.env.NEXT_PUBLIC_LOGO_DEV_TOKEN; export const LOGO_DEV_TOKEN = process.env.NEXT_PUBLIC_LOGO_DEV_TOKEN;
export function buildLogoDevUrl( export function buildLogoDevUrl(domain?: string | null): string | null {
domain?: string | null,
): string | null {
if (!LOGO_DEV_TOKEN || !domain) return null; if (!LOGO_DEV_TOKEN || !domain) return null;
return `https://img.logo.dev/${domain}?token=${LOGO_DEV_TOKEN}&size=64&format=png`; return `https://img.logo.dev/${domain}?token=${LOGO_DEV_TOKEN}&size=64&format=png`;
} }