목록인턴 (11)
juni
공통으로 사용되는 인증서 로직 분리import { useState, useEffect, useRef, useImperativeHandle } from "react";const useCertificateLogic = ({ ref, formData, onFileReady,}: { ref: any; formData: any; onFileReady?: (file: Blob) => void;}) => { const [symbolImage, setSymbolImage] = useState(null); const [signImage, setSignImage] = useState(null); const [width, setWidth] = useState(0); const refContainer = u..
뱃지 공통 로직 분리 예시import { useRef, useState, useEffect } from "react";import { toSvg } from "html-to-image";import { useCertificateContext } from "@/lib/provider/CertificateProvider";import { use} from "@/lib/provider/Provider";import { DEFAULT_IMAGE_URL } from "@/lib/constants";export const useBadgeLogic = ({ formData, onFileReady,}: { formData?: any; onFileReady?: (file: Blob) => void;}) => { ..

app디렉토리 하위에 ...slug를 이용하여 /main/~~~ 하위 404페이지 연결 예시📦[...slug] ┗ 📜page.tsximport { notFound } from "next/navigation";export default function Catch404Page() { notFound(); // 모든 잘못된 하위 경로에서 404 페이지 호출 return null;} not-found.tsx 예시"use client";import NavHeaderNotFound from "@/components/navigation/NavHeaderNotFound";import { Button } from "@/components/ui/button";import Image from "next/image"..

Footer 코드 예시export default function Footer() { const router = useRouter(); const snsLogos = { youtube: "/icons/sns/youtube.png", facebook: "/icons/sns/facebook.png", instagram: "/icons/sns/instagram.png", twitter: "/icons/sns/twitter.png", telegram: "/icons/sns/telegram.png", discord: "/icons/sns/discord.png", kakao: "/icons/sns/kakao.png", linkedin: "/icons/sns/linkedi..
커뮤니티 QA 및 리팩토링피드 작성/수정디테일피드에서 작성/수정피드 삭제 시 모달 꺼지도록 개선수정 시 모달에는 반영 안되던 문제 해결수정 시 기존 이미지 못 불러오던 문제 해결피드 수정수정 실패 오류 해결이미지 추가했다가 삭제했는데 삭제한 이미지가 저장되던 문제 해결피드 작성무조건 고정 피드 목록에도 같이 생성되던 문제 해결피드 고정피드 고정 시 생성순이 아닌 고정순으로 나열고정된 피드 내용 길 경우 마지막에 ... 으로 나오도록 개선공지사항 고정 시 텍스트위아래 잘리지 않도록 개선상세 피드댓글을 새로 남겨야지만 기존 댓글이 보이던 문제 해결링크 복사인증서 링크 복사 후 링크로 이동하면 인증서 상세 조회 오류 발생 해결
게시글 상세 조회 API 예시 -> 고정 게시글 리스트에서도 상세보기를 위해 사용// 글 목록 조회export const findFeeds = async ( domain: string, tagKey?: string, limit?: number, lastId?: number) => { let searchParams; if (!tagKey) { searchParams = { limit, lastId }; } else { searchParams = { tagKey, limit, lastId }; } return await getApi(`/clubs/${domain}/feeds`, searchParams, false);};// 글 상세 조회export const getFeedDetai..

이전 게시글 관련글과 연계 모달 페이지 커스텀 DropDownMenu에서 고정 로직 예시 const togglePinFeed = async () => { const tagKey = item.tags[0]?.tagKey; if (!tagKey) { toast({ description: "고정할 유효한 태그 키가 없습니다.", state: "warning", }); return; } if (item.pinnedTagKey) { const result = await unpinFeed(params.domain as string, item.id); // 실제 도메인 값 필요 if (result.statusCode === ..

프로필 이미지를 아바타와 이미지로 별도 관리 예시const profileFormSchema = z.object({ name: z .string() .min(1, { message: "Your name must be at least 1 characters.", }) .max(20, { message: "Your name must be at most 20 characters.", }), nickname: z .string() .min(1, { message: "Your nickname must be at least 1 characters.", }) .max(20, { message: "Your nickname must b..