Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
ea86ebb
fix: 모바일 네비게이션 반영
dongmin0204 Jul 8, 2025
9eec5b4
Merge pull request #290 from DguFarmSystem/fix/#290
dongmin0204 Jul 8, 2025
1efe522
feat: 소식 페이지 페이지네이션 추가
karpitony Jul 11, 2025
6efb490
fix: 소식 피그마랑 비슷하게 + 모바일에선 카드형으로 표시
karpitony Jul 11, 2025
6b61f15
fix: 모바일에서 게시일자와 태그 겹치는거 두줄로 해결
karpitony Jul 11, 2025
5284a85
Merge pull request #293 from DguFarmSystem/fix/#291
dongmin0204 Jul 11, 2025
0ad20de
feat: serveless function 추가
dongmin0204 Jul 16, 2025
a78ccb2
feat: 서버리스 함수 구동 시 빌드 config 수정
dongmin0204 Jul 16, 2025
44266d7
fix: 컴파일 범위 축소
dongmin0204 Jul 16, 2025
d7ebb6c
fix: commonjs로 확장자 변경
dongmin0204 Jul 16, 2025
cab36ac
fix: 기존 삭제
dongmin0204 Jul 16, 2025
455de22
fix: .js로 수정
dongmin0204 Jul 16, 2025
a5fcea9
fix: 프리뷰 hook api 연결 완료
dongmin0204 Jul 16, 2025
65b1e00
fix:tsconfig 변경
dongmin0204 Jul 16, 2025
3392bc9
fix: 기타 수정 사항 반영
dongmin0204 Jul 16, 2025
a2e612d
fix: 프로젝트 상세 보기 이미지 변경
dongmin0204 Jul 16, 2025
3ff2240
fix: logo 배경제거
dongmin0204 Jul 16, 2025
7d16d6a
Merge pull request #294 from DguFarmSystem/fix/#292_2
dongmin0204 Jul 16, 2025
92b0511
fix: 배포 시 토큰 오류 삭제
dongmin0204 Jul 16, 2025
38d380c
Merge pull request #295 from DguFarmSystem/deploy/#293
dongmin0204 Jul 16, 2025
7b47a80
fix: ci/cd코드 수정
dongmin0204 Jul 18, 2025
b35ca15
Merge pull request #296 from DguFarmSystem/deploy/#293
dongmin0204 Jul 18, 2025
4e96ac5
fix: deploy.yml 수정
dongmin0204 Jul 18, 2025
b0e2313
Merge pull request #297 from DguFarmSystem/deploy/#293
dongmin0204 Jul 18, 2025
d86c773
fix: vercel missing_directory오류
dongmin0204 Jul 19, 2025
3925249
Merge pull request #298 from DguFarmSystem/deploy/#293
dongmin0204 Jul 19, 2025
7a9d49c
fix: 동적 렌더링 구현
dongmin0204 Jul 19, 2025
a5c2d8c
Merge pull request #299 from DguFarmSystem/deploy/#293
dongmin0204 Jul 19, 2025
7ab298c
fix: serverless function 패키지 수정
dongmin0204 Jul 19, 2025
ed32040
fix: vercel.json 수정
dongmin0204 Jul 19, 2025
30cca1c
Merge pull request #300 from DguFarmSystem/deploy/#293
dongmin0204 Jul 19, 2025
ff5d748
fix: vercel.json 작성 형식 수정
dongmin0204 Jul 19, 2025
f32df04
Merge pull request #301 from DguFarmSystem/deploy/#293
dongmin0204 Jul 19, 2025
b90c780
fix: node 22버전 맞추어 변경
dongmin0204 Jul 19, 2025
b620bf6
Merge pull request #302 from DguFarmSystem/deploy/#293
dongmin0204 Jul 19, 2025
267b682
fix:서버리스 종속성 해결
dongmin0204 Jul 22, 2025
d02d87c
Merge pull request #303 from DguFarmSystem/deploy/#293
dongmin0204 Jul 22, 2025
87365d0
feat: zustand store 추가
dongmin0204 Jul 23, 2025
4a5bd6d
fix: 링크 preview 수정
dongmin0204 Jul 23, 2025
1c63f5e
fix: 블로그 localstorage 사용 맟 로딩 순차적 추가
dongmin0204 Jul 23, 2025
959410a
Merge pull request #305 from DguFarmSystem/fix/#304
dongmin0204 Jul 23, 2025
1c96eec
chore: 게임 빌드 넣기
dongmin0204 Aug 28, 2025
42afff1
fix: 게임 iframe height 올림
dongmin0204 Aug 28, 2025
7b2e5ee
Merge pull request #307 from DguFarmSystem/chore/#306
dongmin0204 Aug 28, 2025
5521546
fix: iframe
dongmin0204 Aug 28, 2025
05b9ab7
Merge pull request #308 from DguFarmSystem/chore/#306
dongmin0204 Aug 28, 2025
cd81e4a
chore: 게임 빌드파일 업데이트
karpitony Aug 28, 2025
0980a0d
fix: Vercel 배포 시 WebGL 빌드 파일의 헤더 문제 수정
karpitony Aug 28, 2025
37a80da
fix: 파일명으로 콘텐츠 타입 지정하게끔 수정
karpitony Aug 28, 2025
778020f
feat: 버튼을 클릭하여 명시적으로 WebGL 불러오게 수정
karpitony Aug 28, 2025
5cb6201
chore: 게임 빌드파일 수정
karpitony Aug 28, 2025
9cb963a
chore: 게임 빌드파일 수정
karpitony Aug 28, 2025
f59d603
chore: 게임 빌드 파일 수정
karpitony Aug 28, 2025
f5c5e44
fix: 버셀 빌드시 cache hit 걸리게끔
karpitony Aug 28, 2025
ba3f0dd
chore: 팜시스템 게임 빌드 수정
karpitony Aug 28, 2025
5d0d9c5
chore: 게임 빌드 정적 추가
dongmin0204 Aug 29, 2025
ebdc39d
hotfix: webGL 프론트엔드 레포지토리에서 제거
dongmin0204 Sep 8, 2025
66cc6be
hotfix: 게임 페이지 디자인 수정
dongmin0204 Sep 8, 2025
a940d25
chore(farminglog): ignore Unity WebGL build folder (apps/farminglog/p…
dongmin0204 Sep 8, 2025
7ead4f6
hotfix: 배포 충돌 해결
dongmin0204 Sep 8, 2025
4abb5de
fix: main 브랜치의 hotfix 반영
dongmin0204 Sep 12, 2025
6bbfeb6
fix: 서버리스 function 삭제
dongmin0204 Sep 12, 2025
0d35fe1
fix: 서버리스 function vercel에서 제외
dongmin0204 Sep 12, 2025
c3d7f26
fix: 로딩 시, 스켈레톤 이미지 추가
dongmin0204 Sep 12, 2025
61f400e
fix: 이미지 중앙 정렬 완료
dongmin0204 Sep 13, 2025
e5c6cdf
fix: 이미지 없을 시 기본 값으로 삽입
dongmin0204 Sep 13, 2025
f987019
fix: 프로젝트 디테일 오류/로딩 시 스켈레톤 ui
dongmin0204 Sep 13, 2025
88c7814
fix: 뉴스 스켈레톤 추가
dongmin0204 Sep 13, 2025
d2723b7
fix: 뉴스 모바일 태그 폰트, 패딩 줄이기 (4개 이상에서도 잘 나오게)
dongmin0204 Sep 13, 2025
b98a0aa
Merge pull request #313 from DguFarmSystem/fix/#309
dongmin0204 Sep 15, 2025
58be16a
fix: og태그 추출 후 오류 수정
dongmin0204 Sep 15, 2025
9a8e1ea
Merge pull request #314 from DguFarmSystem/fix/#309
dongmin0204 Sep 15, 2025
b3c016e
fix: 반응형 갭 추가
dongmin0204 Sep 15, 2025
e60d6be
fix: 스켈레톤 모바일 반응형 추가
dongmin0204 Sep 15, 2025
7db9025
Merge pull request #315 from DguFarmSystem/fix/#309
dongmin0204 Sep 15, 2025
9405dfb
hotfix: 블로그/프로젝트 카드 크기 수정
dongmin0204 Sep 15, 2025
5e8b9b0
hotfix: 반응형 사이즈 추가
dongmin0204 Sep 15, 2025
7663965
fix: 블로그/ 프로젝트 간격 수정
dongmin0204 Sep 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,18 @@ jobs:
git config user.name farmsystem-account
git config user.email ${{ secrets.EMAIL }}

# 게임 애들꺼 push 제외
- name: Exclude Unity WebGL build (deploy-only)
run: |
# Remove from index if present, but do not fail if missing
git rm -r --cached --ignore-unmatch apps/farminglog/public/WebGLBuild || true
# Create a temporary commit only in the workflow context
git commit -m "chore(ci): exclude apps/farminglog/public/WebGLBuild from deploy sync" || echo "No changes to commit"

- name: Push changes to forked-repo
run: |
git push -f forked-repo ${{ env.TARGET_BRANCH }}

- name: Clean up
run: |
git remote remove forked-repo
git remote remove forked-repo
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,4 @@ dist-ssr
*.sln
*.sw?
.vercel

12 changes: 12 additions & 0 deletions apps/farminglog/src/components/Header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import mainIcon from "@/assets/logos/logo.basic.png"; // 메인 아이콘
import crownIcon from "@/assets/Icons/tabler_crown.png"; // 랭킹 아이콘
import pencilIcon from "@/assets/Icons/edit-3.png"; // 파밍 아이콘
import thumbsUpIcon from "@/assets/Icons/goodgood.png"; // 응원 아이콘
import gameIcon from "@/assets/Icons/Seed.png"; // 게임 아이콘 (씨앗 아이콘 사용)

import useMediaQueries from "@/hooks/useMediaQueries";
import Popup from "@/components/Popup/popup";
Expand All @@ -17,6 +18,7 @@ const navItems = [
{ label: "홈", path: "/home" },
{ label: "응원", path: "/cheer" },
{ label: "파밍로그", path: "/farminglog/view" },
{ label: "게임", path: "/game" },
{ label: "랭킹", path: "/rankingDetail" },
];

Expand Down Expand Up @@ -149,6 +151,16 @@ export default function Header() {
} as React.CSSProperties}
onClick={() => handleNavigation("/farminglog/view")}
/>
<S.MobileNavButton
style={{
top: "50px",
right: "50px",
backgroundImage: `url(${gameIcon})`,
opacity: isMenuOpen ? 1 : 0,
transform: isMenuOpen ? "scale(1)" : "scale(0.5)",
} as React.CSSProperties}
onClick={() => handleNavigation("/game")}
/>
</>
)}
<S.MobileMainButton onClick={() => setMenuOpen((prev) => !prev)}>
Expand Down
32 changes: 32 additions & 0 deletions apps/farminglog/src/components/UnityWebGL/UnityWebGL.styled.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import styled from 'styled-components';

export const UnityContainer = styled.div`
position: relative;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
margin: 20px 0;
`;

export const UnityWrapper = styled.iframe`
max-width: 100%;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
border-radius: 12px;

&:hover {
box-shadow: 0 6px 25px rgba(0, 0, 0, 0.15);
}
`;

// 반응형 디자인을 위한 미디어 쿼리
export const ResponsiveUnityWrapper = styled(UnityWrapper)`
@media (max-width: 768px) {
width: 100% !important;
height: 400px !important;
}

@media (max-width: 480px) {
height: 300px !important;
}
`;
134 changes: 134 additions & 0 deletions apps/farminglog/src/components/UnityWebGL/UnityWebGL.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import React, { useEffect, useRef, useState } from 'react';
import { UnityContainer, UnityWrapper } from './UnityWebGL.styled';

interface UnityWebGLProps {
width?: string | number;
height?: string | number;
className?: string;
}

const UnityWebGL: React.FC<UnityWebGLProps> = ({
width = '100%',
height = '1000px',
className
}) => {
const iframeRef = useRef<HTMLIFrameElement>(null);
const [isLoading, setIsLoading] = useState(true);
const [hasError, setHasError] = useState(false);

useEffect(() => {
const iframe = iframeRef.current;
if (!iframe) return;

// 타임아웃 설정 (30초)
const timeoutId = setTimeout(() => {
if (isLoading) {
setIsLoading(false);
setHasError(true);
}
}, 30000);

const handleLoad = () => {
clearTimeout(timeoutId);
setIsLoading(false);
setHasError(false);
};

const handleError = () => {
clearTimeout(timeoutId);
setIsLoading(false);
setHasError(true);
};

iframe.addEventListener('load', handleLoad);
iframe.addEventListener('error', handleError);

return () => {
clearTimeout(timeoutId);
iframe.removeEventListener('load', handleLoad);
iframe.removeEventListener('error', handleError);
};
}, [isLoading]);

if (hasError) {
return (
<UnityContainer className={className}>
<div style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
height: height,
backgroundColor: '#f8f9fa',
border: '1px solid #e9ecef',
borderRadius: '12px',
color: '#6c757d',
padding: '20px',
textAlign: 'center'
}}>
<h3>Unity WebGL 게임을 로드할 수 없습니다</h3>
<p>가능한 해결 방법:</p>
<ul style={{ textAlign: 'left', margin: '10px 0' }}>
<li>브라우저를 새로고침해보세요</li>
<li>WebGL을 지원하는 브라우저를 사용하세요 (Chrome, Firefox, Safari)</li>
<li>개발자 도구 콘솔에서 에러 메시지를 확인하세요</li>
</ul>
<button
onClick={() => window.location.reload()}
style={{
padding: '10px 20px',
backgroundColor: '#2d5016',
color: 'white',
border: 'none',
borderRadius: '8px',
cursor: 'pointer',
marginTop: '10px'
}}
>
페이지 새로고침
</button>
</div>
</UnityContainer>
);
}

return (
<UnityContainer className={className}>
{isLoading && (
<div style={{
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
zIndex: 1,
backgroundColor: 'rgba(255, 255, 255, 0.95)',
padding: '20px',
borderRadius: '12px',
boxShadow: '0 4px 20px rgba(0,0,0,0.1)',
border: '1px solid #e9ecef'
}}>
<p style={{ margin: 0, color: '#495057' }}>Unity 게임 로딩 중...</p>
</div>
)}
<UnityWrapper
ref={iframeRef}
src="/WebGLBuild/BuildTest/index.html"
width={width}
height={height}
frameBorder="0"
title="Unity WebGL Game"
allow="fullscreen; autoplay; microphone; camera"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-presentation"
style={{
border: 'none',
borderRadius: '12px',
opacity: isLoading ? 0.3 : 1,
transition: 'opacity 0.3s ease'
}}
/>

</UnityContainer>
);
};

export default UnityWebGL;
2 changes: 2 additions & 0 deletions apps/farminglog/src/components/UnityWebGL/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { default as UnityWebGL } from './UnityWebGL';
export * from './UnityWebGL.styled';
5 changes: 3 additions & 2 deletions apps/farminglog/src/hooks/useNotificationSSE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export const useNotificationSSE = () => {
.getReader();

let buffer = '';
// eslint-disable-next-line no-constant-condition
while (true) {
const { value, done } = await reader.read();
if (done) break;
Expand All @@ -54,8 +55,8 @@ export const useNotificationSSE = () => {

buffer = lines[lines.length - 1];
}
} catch (err: any) {
if (err.name === 'AbortError') {
} catch (err: unknown) {
if (err instanceof Error && err.name === 'AbortError') {
console.log('SSE 연결 중단됨');
} else {
console.error('SSE 연결 오류:', err);
Expand Down
32 changes: 32 additions & 0 deletions apps/farminglog/src/pages/UnityGame/index.styled.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import styled from 'styled-components';

export const GameContainer = styled.div`
max-width: 1200px;
margin: 0 auto;
padding: 40px 20px;
min-height: 1000px;
`;

export const GameTitle = styled.h1`
font-size: 2.5rem;
font-weight: bold;
text-align: center;
margin-bottom: 20px;
color: #333;

@media (max-width: 768px) {
font-size: 2rem;
}
`;

export const GameDescription = styled.p`
font-size: 1.1rem;
text-align: center;
color: #666;
margin-bottom: 30px;
line-height: 1.6;

@media (max-width: 768px) {
font-size: 1rem;
}
`;
22 changes: 22 additions & 0 deletions apps/farminglog/src/pages/UnityGame/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import React from 'react';
import { UnityWebGL } from '../../components/UnityWebGL';
import { GameContainer, GameTitle, GameDescription } from './index.styled';

const UnityGame: React.FC = () => {
return (
<GameContainer>
<GameTitle>Unity WebGL 게임</GameTitle>
<GameDescription>
아래에서 Unity로 제작된 WebGL 게임을 플레이할 수 있습니다.
게임이 로드되지 않는 경우 브라우저를 새로고침해주세요.
</GameDescription>

<UnityWebGL
width="100%"
height="1000px"
/>
</GameContainer>
);
};

export default UnityGame;
4 changes: 2 additions & 2 deletions apps/farminglog/src/pages/auth/SocialRedirect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ export default function SocialRedirect() {
try {
await socialLogin({ code, socialType: provider });
navigate('/home');
} catch (error: any) {
const status = error?.status;
} catch (error: unknown) {
const status = (error as { status?: number })?.status;

if (status === 404) {
setErrorTitle(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ const handleNext = () => {
setErrorMessage('회원 인증에 실패했습니다.');
}
},
onError: (err: any) => {
if (err.status === 401 || err.status === 404) {
onError: (err: unknown) => {
if ((err as { status?: number })?.status === 401 || (err as { status?: number })?.status === 404) {
setStep('not-member');
} else {
setErrorMessage('서버 오류입니다. 운영진에게 문의해주세요.');
Expand Down
2 changes: 1 addition & 1 deletion apps/farminglog/src/pages/cheer/write/cheer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ export default function CheerMessageEditor({ searchedUser }: CheerMessageEditorP
await queryClient.invalidateQueries({ queryKey: ['cheerList'] });
await queryClient.invalidateQueries({ queryKey: ['user', 'today-seed'] });

const updatedSeed = queryClient.getQueryData<any>(['user', 'today-seed']);
const updatedSeed = queryClient.getQueryData<{ isCheer?: boolean }>(['user', 'today-seed']);
const isFirstCheer = !todaySeed?.isCheer && updatedSeed?.isCheer;

setPopupMessage({
Expand Down
Loading