diff --git a/index.html b/index.html index db1fe31..db8151b 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,40 @@ - seed + 과제 고민 끝, 대학생 맞춤형 AI 프롬프트 가이드 - SEED + + + + + + + + + + + +
diff --git a/public/googlefdf77e33a4cf56c6.html b/public/googlefdf77e33a4cf56c6.html new file mode 100644 index 0000000..81d4520 --- /dev/null +++ b/public/googlefdf77e33a4cf56c6.html @@ -0,0 +1 @@ +google-site-verification: googlefdf77e33a4cf56c6.html \ No newline at end of file diff --git a/src/features/main/hooks/index.ts b/src/features/main/hooks/index.ts index 1644c00..bb5fa09 100644 --- a/src/features/main/hooks/index.ts +++ b/src/features/main/hooks/index.ts @@ -4,5 +4,3 @@ export * from "./usePhraseCloudMotion"; export * from "./useExecutionOnlySectionState"; export * from "./useSolutionTimelineProgress"; export * from "./useObservedHeight"; -export * from "./useWaitList"; -export * from "./useSendEmail"; diff --git a/src/features/main/hooks/useSendEmail.ts b/src/features/main/hooks/useSendEmail.ts deleted file mode 100644 index f1152d2..0000000 --- a/src/features/main/hooks/useSendEmail.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { useRef, useState } from "react"; -import type React from "react"; - -import { useWaitList } from "./useWaitList"; - -type SubmitStatus = "idle" | "loading" | "success" | "error"; - -export const useSendEmail = () => { - const [email, setEmail] = useState(""); - const [submitStatus, setSubmitStatus] = useState("idle"); - const [errorMessage, setErrorMessage] = useState(""); - - const isSubmittingRef = useRef(false); - - const { submit } = useWaitList(); - - const submitWaitlistEmail = async () => { - const trimmedEmail = email.trim(); - if (!trimmedEmail || isSubmittingRef.current) return; - - isSubmittingRef.current = true; - setSubmitStatus("loading"); - setErrorMessage(""); - - try { - const result = await submit(trimmedEmail); - - if (!result.success) { - setErrorMessage( - result.errorMessage ?? - "오류가 발생했습니다. 잠시 후 다시 시도해주세요.", - ); - setSubmitStatus("error"); - } else { - setSubmitStatus("success"); - } - } finally { - isSubmittingRef.current = false; - } - }; - - const submitOnEnter = (e: React.KeyboardEvent) => { - if (e.key === "Enter") submitWaitlistEmail(); - }; - - return { - email, - setEmail, - submitStatus, - errorMessage, - submitWaitlistEmail, - submitOnEnter, - }; -}; diff --git a/src/features/main/hooks/useWaitList.ts b/src/features/main/hooks/useWaitList.ts deleted file mode 100644 index f81020f..0000000 --- a/src/features/main/hooks/useWaitList.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { FunctionsHttpError } from "@supabase/supabase-js"; - -import { supabase } from "@/shared"; - -type WaitlistSubmitResult = { - success: boolean; - errorMessage?: string; -}; - -export const useWaitList = () => { - const submit = async (email: string): Promise => { - try { - const { error } = await supabase.functions.invoke("notify-waitlist", { - body: { email }, - }); - - if (error) { - let message = "오류가 발생했습니다. 잠시 후 다시 시도해주세요."; - try { - if (error instanceof FunctionsHttpError) { - const body = await error.context.json(); - if (body?.error) message = body.error; - } - } catch (e) { - console.error("Error parsing error message:", e); - } - return { success: false, errorMessage: message }; - } - - return { success: true }; - } catch (e) { - console.error("useWaitList submit 중 예기치 않은 오류 발생:", e); - return { - success: false, - errorMessage: "오류가 발생했습니다. 잠시 후 다시 시도해주세요.", - }; - } - }; - - return { submit }; -}; diff --git a/src/features/main/ui/SendEmailSection.tsx b/src/features/main/ui/SendEmailSection.tsx deleted file mode 100644 index c1fbc88..0000000 --- a/src/features/main/ui/SendEmailSection.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { Button, Flex, Input, Text, VStack } from "@chakra-ui/react"; - -import { CheckIcon } from "@/shared"; - -import { useSendEmail } from "../hooks"; - -export const SendEmailSection = () => { - const { - email, - setEmail, - submitStatus, - errorMessage, - submitWaitlistEmail, - submitOnEnter, - } = useSendEmail(); - - return ( - - {submitStatus === "success" ? ( - - - - 알림 신청이 완료되었습니다! - - - ) : ( - <> - - - 이메일 - - setEmail(e.target.value)} - onKeyDown={submitOnEnter} - /> - {submitStatus === "error" && ( - - {errorMessage} - - )} - - - - - - - )} - - ); -}; diff --git a/src/features/main/ui/index.ts b/src/features/main/ui/index.ts index 1c17ab9..b4b94f4 100644 --- a/src/features/main/ui/index.ts +++ b/src/features/main/ui/index.ts @@ -1,3 +1,2 @@ export { AssignmentHelpSection } from "./AssignmentHelpSection"; export { ExecutionOnlySection } from "./ExecutionOnlySection"; -export * from "./SendEmailSection"; diff --git a/src/pages/main/MainPage.tsx b/src/pages/main/MainPage.tsx index 9759b01..ce886fd 100644 --- a/src/pages/main/MainPage.tsx +++ b/src/pages/main/MainPage.tsx @@ -1,16 +1,14 @@ import { useState } from "react"; +import { useNavigate } from "react-router"; import { Box, Button, Flex, HStack, Text, VStack } from "@chakra-ui/react"; -import { - AssignmentHelpSection, - ExecutionOnlySection, - SendEmailSection, -} from "@/features"; -import { CheckIcon, CopyIcon, SparklesIcon } from "@/shared"; +import { AssignmentHelpSection, ExecutionOnlySection } from "@/features"; +import { CheckIcon, CopyIcon, ROUTE_PATHS, SparklesIcon } from "@/shared"; export default function MainPage() { const [isSolutionSectionReady, setIsSolutionSectionReady] = useState(false); + const navigate = useNavigate(); return ( @@ -88,17 +86,38 @@ export default function MainPage() { - + + + - + @@ -335,9 +354,9 @@ export default function MainPage() { as="section" bg="white" display="flex" - h="100dvh" + minH="100dvh" justifyContent="center" - py={11} + py={{ base: 16, md: 20, lg: 24 }} w="full" >