Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ export default function LinkFieldEdit({
)
);

// 자동 클립보드 붙여넣기 기능
if (navigator.clipboard) {
try {
const clipboardText = await navigator.clipboard.readText();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ const ExitModal: React.FC<ExitModalProps> = function ExitModal({
</div>
</div>

{/* Buttons */}
<div className="flex border-t border-[#f0f0f0]">
<button
type="button"
Expand Down
8 changes: 8 additions & 0 deletions fe/src/app/eventcreate-page/utils/formHelpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export const cleanString = (value: string): string => value.trim();

export const isValidLength = (value: string, minLength: number): boolean =>
value.length >= minLength;

export const generateDefaultEventName = (
location: string | undefined
): string => (location ? `${location} 모임` : "");
30 changes: 19 additions & 11 deletions fe/src/app/eventcreate-page/components/EventNameInput.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
"use client";

import React, { useEffect, useState, useCallback } from "react";
import React, { useState, useEffect, useCallback } from "react";
import Image from "next/image";
import { EventNameInputProps } from "@/app/eventcreate-page/types/types";
import classNames from "classnames";
import {
cleanString,
isValidLength,
generateDefaultEventName,
} from "../utils/formHelpers";

function EventNameInput({
interface EventNameInputProps {
className?: string;
selectedLocation?: string;
value: string;
onChange: (value: string) => void;
}

export default function EventNameInput({
className,
selectedLocation,
onChange,
value,
}: EventNameInputProps) {
const [hasUserEdited, setHasUserEdited] = useState(false);
const [isTyping, setIsTyping] = useState(false);
const showWarning = hasUserEdited && value.trim().length < 1;
const showWarning = hasUserEdited && !isValidLength(cleanString(value), 1);

useEffect(() => {
if (!hasUserEdited) {
const newEventName = selectedLocation ? `${selectedLocation} 모임` : "";
const newEventName: string = generateDefaultEventName(selectedLocation);
onChange(newEventName);
}
}, [selectedLocation, onChange, hasUserEdited]);
Expand Down Expand Up @@ -50,7 +61,7 @@ function EventNameInput({
className={classNames(
"relative w-[328px] h-14 p-4 bg-[#f7f7f7] rounded-lg flex justify-between items-center border-2",
{
"border-danger-base": showWarning,
"border-[#f73a2c]": showWarning,
"border-[#555555]": isTyping,
"border-transparent": !isTyping && !showWarning,
}
Expand All @@ -66,13 +77,12 @@ function EventNameInput({
className={classNames(
"bg-transparent text-base font-medium font-['Pretendard'] leading-normal outline-none flex-grow",
{
"text-[#2c2c2c]": isTyping || value.trim().length > 0,
"text-[#8e8e8e]": !isTyping && value.trim().length === 0,
"text-[#2c2c2c]": isTyping || cleanString(value).length > 0,
"text-[#8e8e8e]": !isTyping && cleanString(value).length === 0,
}
)}
aria-label="이벤트 이름 입력"
/>

{value && (
<button
type="button"
Expand All @@ -99,5 +109,3 @@ function EventNameInput({
</div>
);
}

export default EventNameInput;
1 change: 0 additions & 1 deletion fe/src/app/robots.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// app/robots.ts
import { MetadataRoute } from "next";

export default function robots(): MetadataRoute.Robots {
Expand Down