Skip to content
Merged

Dev #35

Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file added dpbr_front/app/git_branches.txt
Binary file not shown.
35 changes: 35 additions & 0 deletions dpbr_front/app/git_branches_utf8.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
๏ปฟ dev
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

์ด ํŒŒ์ผ์€ Git ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฒ„์ „ ๊ด€๋ฆฌ ๋Œ€์ƒ์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ญ์ œํ•˜๊ณ  .gitignore์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

feat/comment-anon-and-delete-modal-dev
feature-login-signup
feature/admin-team-profile
feature/frontend-ui-redesign
* feature/frontend-ui-updates
feature/ui-improvement
feature/ui-save-card-improve
feature/ๆฟก์’“๋ ‡???๋šฏ์ๅช›ย€???์„์” ๏งžย€
fix/sidebar-layout-text-fix
main
remotes/origin/CI/CD
remotes/origin/HEAD -> origin/main
remotes/origin/backend
remotes/origin/dev
remotes/origin/feat/application-form-migration
remotes/origin/feat/comment-anon-and-delete-modal-dev
remotes/origin/feat/dev-deployment
remotes/origin/feat/pagination-infinite-sync
remotes/origin/feature/admin-team-profile
remotes/origin/feature/frontend-ui-redesign
remotes/origin/feature/frontend-ui-updates
remotes/origin/feature/full-page-capture
remotes/origin/feature/ui-improvement
remotes/origin/feature/ui-save-card-improve
remotes/origin/feature/?๋ณค?
remotes/origin/feature/ๆฟก์’“๋ ‡???๋šฏ์ๅช›ย€???์„์” ๏งžย€
remotes/origin/fix/deployment-config
remotes/origin/fix/sidebar-layout-text-fix
remotes/origin/fix/ๆฟก์’“๋ ‡??id-pw-?์„์ ™-#17
remotes/origin/kakao-login-with-backend
remotes/origin/login-only-comment
remotes/origin/main
remotes/origin/sync/dev-into-feature-ui-improvement
remotes/origin/work/frontend-feature-gap
Comment on lines +1 to +35
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸ  Major

๋ธŒ๋žœ์น˜ ๋คํ”„ ํŒŒ์ผ์€ ์ €์žฅ์†Œ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Line 1-35๋Š” ๋กœ์ปฌ/์›๊ฒฉ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฐ์ถœ๋ฌผ๊ณผ ๋ฌด๊ด€ํ•˜๋ฉฐ ๋‚ด๋ถ€ ์šด์˜ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ PR์—์„œ๋Š” ์ œ๊ฑฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dpbr_front/app/git_branches_utf8.txt` around lines 1 - 35, The file
dpbr_front/app/git_branches_utf8.txt contains a branch dump that shouldn't be
committed; remove it from the repo and prevent future commits by deleting the
file (or git rm --cached) and adding dpbr_front/app/git_branches_utf8.txt to
.gitignore, then commit that change; if history must be cleaned, run a
history-rewrite (e.g., BFG/git-filter-repo) to purge the file. To locate the
exact content to remove, look for the file name git_branches_utf8.txt and branch
lines like remotes/origin/ or branch names such as dev and
feature/frontend-ui-updates within that file.

12 changes: 12 additions & 0 deletions dpbr_front/app/git_status_utf8.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
๏ปฟOn branch feature/frontend-ui-updates
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

์ด ํŒŒ์ผ์€ Git ์ƒํƒœ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฒ„์ „ ๊ด€๋ฆฌ ๋Œ€์ƒ์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ญ์ œํ•˜๊ณ  .gitignore์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)
modified: MSGS_13_F (modified content)

Untracked files:
(use "git add <file>..." to include in what will be committed)
git_status.txt

no changes added to commit (use "git add" and/or "git commit -a")
Comment on lines +1 to +12
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸ  Major

์ž‘์—… ์ค‘ ๋กœ์ปฌ ์ƒํƒœ ํŒŒ์ผ์€ PR์—์„œ ์ œ์™ธํ•ด ์ฃผ์„ธ์š”.

Line 1-12๋Š” ๋กœ์ปฌ Git ์ž‘์—… ์ƒํƒœ ๋คํ”„๋ผ์„œ ์ œํ’ˆ ์ฝ”๋“œ์™€ ๋ฌด๊ด€ํ•˜๊ณ , ๋ธŒ๋žœ์น˜/์„œ๋ธŒ๋ชจ๋“ˆ ์ƒํƒœ ๊ฐ™์€ ๋‚ด๋ถ€ ์ •๋ณด ๋…ธ์ถœ ๋ฆฌ์Šคํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹์—์„œ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ๋งž์Šต๋‹ˆ๋‹ค.

๐Ÿค– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dpbr_front/app/git_status_utf8.txt` around lines 1 - 12, The file
dpbr_front/app/git_status_utf8.txt (and/or git_status.txt) is a local git status
dump and must be removed from the PR โ€” remove the file from the repository
history/commit set (e.g., git rm --cached or delete the file and amend the
commit) so it is no longer tracked or included in the branch, add a rule to
.gitignore to prevent re-adding local git status files, and ensure the commit/PR
only contains product code changes (verify using git status and amend or create
a clean commit without git_status_utf8.txt).

17 changes: 14 additions & 3 deletions dpbr_front/app/src/app.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
@import "tailwindcss";

:root {
color-scheme: light;
}

@font-face {
font-family: 'NexonLv1Gothic';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_20-04@2.1/NEXON Lv1 Gothic OTF Light.woff') format('woff');
Expand Down Expand Up @@ -37,14 +41,21 @@
--color-bg-overlay: #101010;
}

html, body {
html,
body {
font-family: 'NexonLv1Gothic', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background-color: white;
color: var(--color-text-primary);
}

/* ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋“ค์— ์†๊ฐ€๋ฝ ์ปค์„œ ๊ฐ•์ œ ์ ์šฉ */
button, a, input[type="button"], input[type="submit"], input[type="reset"] {
button,
a,
input[type="button"],
input[type="submit"],
input[type="reset"] {
cursor: pointer;
}

Expand All @@ -53,4 +64,4 @@ input[type="button"]:disabled,
input[type="submit"]:disabled,
input[type="reset"]:disabled {
cursor: not-allowed;
}
}
2 changes: 1 addition & 1 deletion dpbr_front/app/src/app.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!doctype html>
<html lang="ko">
<html lang="ko" style="color-scheme: light;">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

app.css ํŒŒ์ผ์˜ :root์— color-scheme: light;๊ฐ€ ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด ์ธ๋ผ์ธ ์Šคํƒ€์ผ์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์€ CSS ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•ด ์ฃผ์„ธ์š”.

Suggested change
<html lang="ko" style="color-scheme: light;">
<html lang="ko">


<head>
<meta charset="utf-8" />
Expand Down
38 changes: 29 additions & 9 deletions dpbr_front/app/src/lib/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,28 @@ function normalizeApiErrorDetail(detail: unknown): string {
return collapsed.slice(0, 200);
}

function parseApiDateTime(raw: string): Date {
const normalized = raw.includes(' ') ? raw.replace(' ', 'T') : raw;
const hasTimezone = /(?:Z|[+-]\d{2}:?\d{2})$/i.test(normalized);
return new Date(hasTimezone ? normalized : `${normalized}Z`);
}
Comment on lines +50 to +54
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸ  Major

๐Ÿงฉ Analysis chain

๐Ÿ Script executed:

#!/bin/bash
set -euo pipefail

echo "[1] ๋Œ“๊ธ€ created_at ์ƒ์„ฑ/์ง๋ ฌํ™” ์œ„์น˜ ํƒ์ƒ‰"
rg -n -C3 --type=py --type=ts --type=js '\bcreated_at\b|/comments'

echo
echo "[2] ๋ฐฑ์—”๋“œ ํƒ€์ž„์กด ์„ค์ • ๋ฐ datetime ์ƒ์„ฑ ํŒจํ„ด ํƒ์ƒ‰"
rg -n -C3 --type=py --type=toml --type=yaml --type=env 'Asia/Seoul|UTC|timezone|TZ|USE_TZ|datetime\.now|utcnow|timezone\.utc'

echo
echo "[3] ํ”„๋ก ํŠธ์—์„œ created_at ํ›„์ฒ˜๋ฆฌ ๋กœ์ง ์œ„์น˜ ํƒ์ƒ‰"
rg -n -C3 --type=ts 'parseApiDateTime|formatCommentDateTime|created_at'

Repository: GC-MapleWind/MSGS_13_F

Length of output: 2195


๐Ÿ Script executed:

#!/bin/bash
set -euo pipefail

echo "[1] api.ts ์ „์ฒด ๋ณด๊ธฐ (lines 50-70)"
sed -n '50,70p' dpbr_front/app/src/lib/api.ts | cat -n

echo
echo "[2] formatCommentDateTime ํ•จ์ˆ˜ ์ „์ฒด ์ •์˜ ์ฐพ๊ธฐ"
rg -n -A10 'formatCommentDateTime' dpbr_front/app/src/lib/api.ts

echo
echo "[3] API ๊ณ„์•ฝ ๋˜๋Š” ๋ฌธ์„œ ํƒ์ƒ‰"
find . -type f \( -name "*.md" -o -name "*.txt" -o -name "*contract*" -o -name "*api*" \) -not -path '*/node_modules/*' -not -path '*/.git/*' | head -20

echo
echo "[4] ๋ฐฑ์—”๋“œ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” API ๋ฌธ์„œ ํƒ์ƒ‰"
git ls-files | grep -iE '(backend|server|docs|api.*\..*md)' | head -20

Repository: GC-MapleWind/MSGS_13_F

Length of output: 2250


๐Ÿ Script executed:

#!/bin/bash
set -euo pipefail

echo "[1] README_API.md ๋‚ด์šฉ"
cat README_API.md

echo
echo "[2] prompt/API_INTEGRATION.md ๋‚ด์šฉ"
cat prompt/API_INTEGRATION.md

echo
echo "[3] prompt/docs/backend_requirements.md ๋‚ด์šฉ"
cat prompt/docs/backend_requirements.md

Repository: GC-MapleWind/MSGS_13_F

Length of output: 10990


๐Ÿ Script executed:

#!/bin/bash
set -euo pipefail

echo "[1] openapi.json ๋˜๋Š” ์Šคํ‚ค๋งˆ ํŒŒ์ผ ์ฐพ๊ธฐ"
find . -type f \( -name "openapi.json" -o -name "*openapi*" -o -name "*schema*" \) -not -path '*/node_modules/*' -not -path '*/.git/*' | head -20

echo
echo "[2] ๋ฐฑ์—”๋“œ ์†Œ์Šค ์ฝ”๋“œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ"
git ls-files | grep -iE '(backend|server|\.py|main\.py|fastapi)' | head -20

echo
echo "[3] api.ts์—์„œ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๊ด€๋ จ ๋ชจ๋“  ํ•จ์ˆ˜ ์ฐพ๊ธฐ"
rg -n 'Date|datetime|timezone|parse.*time|format.*time' dpbr_front/app/src/lib/api.ts

Repository: GC-MapleWind/MSGS_13_F

Length of output: 548


API ๊ณ„์•ฝ์—์„œ created_at ํƒ€์ž„์กด ๋ช…์‹œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

parseApiDateTime()์€ ํƒ€์ž„์กด ์ •๋ณด๊ฐ€ ์—†๋Š” ํƒ€์ž„์Šคํƒฌํ”„์— 'Z'๋ฅผ ๊ฐ•์ œ๋กœ ๋ถ€์ฐฉํ•˜์—ฌ UTC๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค (53์ค„). ๋ฐฑ์—”๋“œ API ๋ฌธ์„œ(README_API.md, backend_requirements.md)์—๋Š” created_at ํ•„๋“œ์˜ ํƒ€์ž„์กด์ด ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ๋ฐฑ์—”๋“œ๊ฐ€ KST naive datetime์„ ์‘๋‹ตํ•  ๊ฒฝ์šฐ formatCommentDateTime()์˜ Asia/Seoul ๋ณ€ํ™˜ ์‹œ 9์‹œ๊ฐ„์˜ ์˜คํ”„์…‹์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”:

  • ๋ฐฑ์—”๋“œ๊ฐ€ UTC ๋˜๋Š” ISO 8601 ํ˜•์‹(์˜ˆ: 2024-01-15T10:30:00Z)์œผ๋กœ ์‘๋‹ตํ•˜๋Š”๊ฐ€?
  • ์•„๋‹ˆ๋ฉด ํƒ€์ž„์กด ์ •๋ณด ์—†์ด KST ๋กœ์ปฌ ์‹œ๊ฐ์„ ์‘๋‹ตํ•˜๋Š”๊ฐ€?

API ๊ณ„์•ฝ์„ ๋ช…์‹œํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด ๋ฐฑ์—”๋“œ ์‘๋‹ต์„ ํ‘œ์ค€ํ™”ํ•˜๊ฑฐ๋‚˜ ํŒŒ์‹ฑ ๋กœ์ง์„ ์กฐ์ •ํ•ด์ฃผ์„ธ์š”.

๐Ÿค– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dpbr_front/app/src/lib/api.ts` around lines 50 - 54, parseApiDateTime
currently forces naive timestamps to UTC by appending 'Z', which misinterprets
KST-naive backend datetimes and causes 9h offsets when later converted in
formatCommentDateTime; fix by aligning the client and API contract and updating
parse logic: either require the backend to always return timezone-aware ISO
strings (update README_API.md/backend_requirements.md) or change
parseApiDateTime to treat timezone-less strings as Asia/Seoul (use a
timezone-aware parser/library so naive strings are parsed as KST) and ensure
formatCommentDateTime consumes the resulting timezone-aware Date/time
consistently. Include references to parseApiDateTime and formatCommentDateTime
in the change so the parsing/formatting behavior is unambiguous.


export function formatCommentDateTime(raw: string): string {
const parsed = parseApiDateTime(raw);
if (Number.isNaN(parsed.getTime())) {
return raw;
}

return parsed.toLocaleString('ko-KR', {
timeZone: 'Asia/Seoul',
year: '2-digit',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
});
}

function isExpiredJwt(token: string): boolean {
try {
const payload = token.split('.')[1];
Expand Down Expand Up @@ -128,6 +150,10 @@ interface TeamMemberResponse {
name: string;
role: string;
profile_img_url: string | null;
message: {
title: string;
content: string;
} | null;
}

interface TeamMemberDetailResponse extends TeamMemberResponse {
Expand Down Expand Up @@ -328,13 +354,7 @@ export async function getComments(page: number = 1, limit: number = 20): Promise
author: comment.author,
authorAvatar: '/default-avatar.png',
content: comment.content,
createdAt: new Date(comment.created_at).toLocaleString('ko-KR', {
year: '2-digit',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
})
createdAt: formatCommentDateTime(comment.created_at)
}));
}

Expand Down Expand Up @@ -380,8 +400,8 @@ export async function getTeamMembers(): Promise<TeamMessageItem[]> {
id: member.id.toString(),
name: member.name,
role: member.role,
title: '',
content: '',
title: member.message?.title || '',
content: member.message?.content || '',
imageUrl: normalizeAssetUrl(member.profile_img_url)
}));
}
Expand Down
41 changes: 23 additions & 18 deletions dpbr_front/app/src/lib/components/BottomSheetLogin.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@
let isLoading = $state(false);
let studentIdInputRef: HTMLDivElement | undefined = $state();
let dialogEl: HTMLDivElement | undefined = $state();

// ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ƒํƒœ
let errorMessage = $state("");
let infoMessage = $state("");

// ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•œ ์ƒํƒœ
let isVisible = $state(false);
Expand Down Expand Up @@ -65,7 +63,7 @@

async function handleLogin() {
if (!name.trim() || !studentId.trim()) {
showToastMessage();
showInfoMessage("์ด๋ฆ„ ๋˜๋Š” ํ•™๋ฒˆ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.");
return;
}

Expand All @@ -74,12 +72,13 @@
try {
await authStore.login(name.trim(), studentId.trim(), saveName);
// ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ฝœ๋ฐฑ ํ˜ธ์ถœ
showInfoMessage("๋กœ๊ทธ์ธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
handleClose();
setTimeout(() => {
onSuccess();
}, 300);
} catch (error) {
showToastMessage();
showInfoMessage("์ด๋ฆ„ ๋˜๋Š” ํ•™๋ฒˆ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.");
studentId = "";
studentIdFocused = true;
setTimeout(() => {
Expand Down Expand Up @@ -108,10 +107,10 @@
}
*/

function showToastMessage(message?: string) {
errorMessage = message || "์ด๋ฆ„ ๋˜๋Š” ํ•™๋ฒˆ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.";
function showInfoMessage(message: string) {
infoMessage = message;
setTimeout(() => {
errorMessage = "";
infoMessage = "";
}, 3000);
Comment on lines +110 to 114
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸก Minor

showInfoMessage ํƒ€์ด๋จธ ์ค‘์ฒฉ์œผ๋กœ ์ตœ์‹  ๋ฉ”์‹œ์ง€๊ฐ€ ์กฐ๊ธฐ ์†Œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Line 110-114์—์„œ ์ด์ „ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•˜์ง€ ์•Š์•„, ์—ฐ์† ํ˜ธ์ถœ ์‹œ ๋จผ์ € ๊ฑธ๋ฆฐ ํƒ€์ด๋จธ๊ฐ€ ๋‚˜์ค‘ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ์ œ์•ˆ ์ˆ˜์ •์•ˆ
+    let infoMessageTimer: ReturnType<typeof setTimeout> | null = null;
+
     function showInfoMessage(message: string) {
         infoMessage = message;
-        setTimeout(() => {
+        if (infoMessageTimer) clearTimeout(infoMessageTimer);
+        infoMessageTimer = setTimeout(() => {
             infoMessage = "";
+            infoMessageTimer = null;
         }, 3000);
     }
๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function showInfoMessage(message: string) {
infoMessage = message;
setTimeout(() => {
errorMessage = "";
infoMessage = "";
}, 3000);
let infoMessageTimer: ReturnType<typeof setTimeout> | null = null;
function showInfoMessage(message: string) {
infoMessage = message;
if (infoMessageTimer) clearTimeout(infoMessageTimer);
infoMessageTimer = setTimeout(() => {
infoMessage = "";
infoMessageTimer = null;
}, 3000);
}
๐Ÿค– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dpbr_front/app/src/lib/components/BottomSheetLogin.svelte` around lines 110 -
114, The showInfoMessage function can let an earlier timeout clear a newer
message because it never clears the previous timer; modify showInfoMessage to
track the timer ID (e.g., a module-level or component-level variable like
infoTimeout), call clearTimeout(infoTimeout) before creating a new setTimeout,
assign the new timeout ID to infoTimeout, and still clear infoMessage inside the
timeout; update any related type annotations if needed so the timer ID is stored
and reused across calls.

}

Expand Down Expand Up @@ -164,9 +163,9 @@
tabindex="-1"
>
<div
class="w-full shrink-0 h-[72vh] bg-gradient-to-b from-[#FCDDA5] to-[#F1A470] rounded-t-3xl pt-4 pb-8 px-6 flex flex-col items-center shadow-lg transition-transform duration-300 {isVisible
? 'translate-y-0'
: 'translate-y-full'}"
class="w-full shrink-0 bg-gradient-to-b from-[#FCDDA5] to-[#F1A470] rounded-t-3xl pt-4 pb-8 px-6 flex flex-col items-center shadow-lg transition-all duration-300 {isVisible
? 'h-[72vh] translate-y-0'
: 'h-[72vh] translate-y-full'}"
onclick={(e) => e.stopPropagation()}
>
<!-- ๋‹ซ๊ธฐ ๋ฒ„ํŠผ -->
Expand All @@ -192,7 +191,13 @@
/>

<!-- ์ž…๋ ฅ ํผ -->
<div class="w-full flex flex-col">
<form
class="w-full flex flex-col"
onsubmit={(e) => {
e.preventDefault();
handleLogin();
}}
>
<!-- ์ž…๋ ฅ ํ•„๋“œ ๊ทธ๋ฃน -->
<div class="flex flex-col gap-1 mb-2">
<!-- ์ด๋ฆ„ ์ž…๋ ฅ -->
Expand Down Expand Up @@ -233,23 +238,23 @@

<!-- ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ -->
<div class="relative w-full">
{#if errorMessage}
{#if infoMessage}
<div
class="absolute bottom-[calc(100%+8px)] left-0 w-full flex justify-center z-[60] pointer-events-none"
class="absolute bottom-full left-1/2 -translate-x-1/2 mb-4 z-[60] pointer-events-none"
>
<span
class="bg-black/60 text-white text-[15px] px-5 py-2.5 rounded-3xl shadow-md font-medium whitespace-nowrap pointer-events-auto"
>
{errorMessage}
{infoMessage}
</span>
</div>
{/if}
<Button
label="๋ฉ”์ƒ๊ฒฐ์‚ฐ ํ†ก ์ž…์žฅ"
variant="primary"
buttonState={isLoading ? "disabled" : "default"}
onClick={handleLogin}
type="button"
onClick={() => {}}
type="submit"
class="bg-white !text-[#F87C56] hover:bg-white/90 font-medium py-[14px] rounded-lg w-full"
/>
</div>
Expand Down Expand Up @@ -298,7 +303,7 @@
<span>์นด์นด์˜ค ๋กœ๊ทธ์ธ</span>
</button>
-->
</div>
</form>

<!-- ํ‘ธํ„ฐ ์•ˆ๋‚ด๋ฌธ๊ตฌ -->
<div class="mt-12 mb-4 flex justify-center">
Expand Down
8 changes: 5 additions & 3 deletions dpbr_front/app/src/lib/components/Button.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@
aria-label={label}
>
<span class="relative z-10">{label}</span>
{#if isPressed || buttonState === "focused"}
<div class="absolute inset-0 bg-black/4 rounded-lg"></div>
{/if}
<div
class="absolute inset-0 bg-black/4 rounded-lg transition-opacity duration-100"
class:opacity-100={isPressed || buttonState === "focused"}
class:opacity-0={!isPressed && buttonState !== "focused"}
></div>
</button>
54 changes: 48 additions & 6 deletions dpbr_front/app/src/lib/components/Header.svelte
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<script lang="ts">
import { toast } from "$lib/stores/toast";

interface Props {
variant?: "main" | "detail" | "close" | "save";
title?: string;
Expand All @@ -18,6 +20,39 @@
onCloseClick,
onTalkClick,
}: Props = $props();

let logoClickCount = $state(0);
let lastLogoClickTime = 0;
let isEasterEggActive = false;

function handleLogoClick() {
if (isEasterEggActive) return;

const now = Date.now();
if (now - lastLogoClickTime < 500) {
logoClickCount += 1;
} else {
logoClickCount = 1;
}
lastLogoClickTime = now;

if (logoClickCount === 3) {
isEasterEggActive = true;
const credits = [
"Fullstack DevOps & PM\n๊ฐ•๋ฏผ",
"\nDesigner & PM\n๊ฐ•๋ฏผ์•„",
"\nFrontend Engineer\nํ™ฉํ˜„์„ฑ",
"\nBackend Engineer\n๋ฐฐ์Šน๋ฏผ ์„œ๋ฏผ์„ฑ ์ด์„œ์œค",
"\nServer Engineer\n๊น€ํ˜•๊ทœ",
].join("\n");
toast.show(credits, 5000, "center");
logoClickCount = 0;

setTimeout(() => {
isEasterEggActive = false;
}, 5000);
}
}
</script>

{#if variant === "main"}
Expand All @@ -38,12 +73,19 @@
draggable="false"
/>
</button>
<img
src="/images/logos/logo-text-white.svg"
alt="๋‹จํ’๋ฐ”๋žŒ"
class="h-[18px] object-contain"
draggable="false"
/>
<button
type="button"
onclick={handleLogoClick}
class="flex items-center justify-center h-full active:scale-95 transition-transform"
aria-label="๋‹จํ’๋ฐ”๋žŒ ๋กœ๊ณ "
>
<img
src="/images/logos/logo-text-white.svg"
alt="๋‹จํ’๋ฐ”๋žŒ"
class="h-[18px] object-contain"
draggable="false"
/>
</button>
<a href="/talk" class="p-2 text-white" aria-label="ํ†ก ํŽ˜์ด์ง€">
<img
src="/images/icons/chat-icon-white.svg"
Expand Down
6 changes: 4 additions & 2 deletions dpbr_front/app/src/lib/components/SettlementListItem.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

<a
href="/msg/{item.id}"
class="flex items-center gap-4 px-6 py-4 bg-white border-b border-bg-light hover:bg-gray-50 focus:bg-gray-50 transition-none last:border-b-0 touch-none select-none"
class="flex items-center gap-4 px-6 py-4 bg-white border-b border-bg-light hover:bg-gray-50 focus:bg-gray-50 transition-none last:border-b-0 select-none"
style="-webkit-touch-callout: none;"
draggable="false"
>
Expand All @@ -38,6 +38,8 @@
class="text-[17px] leading-tight text-text-primary font-semibold truncate"
>{item.title}</span
>
<span class="text-[13px] font-normal text-[#9CA3AF]">{formatDate(item.acquiredAt)}</span>
<span class="text-[13px] font-normal text-[#9CA3AF]"
>{formatDate(item.acquiredAt)}</span
>
</div>
</a>
Loading
Loading