From 7b6310b73903b36ae2a6f66ca33dce0ffc7a83bf Mon Sep 17 00:00:00 2001 From: Edward Kim <65283190+bepyan@users.noreply.github.com> Date: Wed, 21 Aug 2024 03:09:02 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EB=94=A9=20(#80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: InView with framer-motion * feat: add loading layout * feat: text-effect * feat: global loading * feat: delay create invitation * feat: 저장 중 로딩 * feat: 삭제 토스트 추가 * feat: 저장 버튼 평소 활성화 * feat: OG 이미지 설정 (#79) * feat: update thumbnail * feat: apply og image * feat: add layout thumbnail * feat: 템플릿의 썸네일이 초기 적용되도록 --- bun.lockb | Bin 300432 -> 300943 bytes package.json | 1 + src/app/(main)/dashboard/template-item.tsx | 23 ++- src/app/(main)/loading.tsx | 25 +++ src/components/core/in-view.tsx | 50 ++++++ src/components/core/text-effect.tsx | 147 ++++++++++++++++++ src/components/editor/navigation.tsx | 24 ++- .../editor/sidebar/sidebar-settings-tab.tsx | 5 +- src/components/gloabl-loading.tsx | 47 ++++++ src/components/providers.tsx | 2 + tailwind.config.ts | 24 +++ 11 files changed, 325 insertions(+), 23 deletions(-) create mode 100644 src/app/(main)/loading.tsx create mode 100644 src/components/core/in-view.tsx create mode 100644 src/components/core/text-effect.tsx create mode 100644 src/components/gloabl-loading.tsx diff --git a/bun.lockb b/bun.lockb index 2815c0763adc15c5d5883078659eae7d84a92bd2..fbb48e0abc7a1e6563a83c9b2f1251f694d317fd 100755 GIT binary patch delta 54956 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 delta 54016 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 diff --git a/package.json b/package.json index 6aae44e1..f5070a04 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "drizzle-orm": "^0.33.0", "es-hangul": "^1.4.2", "es-toolkit": "^1.13.1", + "framer-motion": "^11.3.28", "ky": "^1.4.0", "lucia": "^3.2.0", "lucide-react": "^0.414.0", diff --git a/src/app/(main)/dashboard/template-item.tsx b/src/app/(main)/dashboard/template-item.tsx index 39b12d08..cfe982c0 100644 --- a/src/app/(main)/dashboard/template-item.tsx +++ b/src/app/(main)/dashboard/template-item.tsx @@ -1,31 +1,42 @@ "use client"; import { useMutation } from "@tanstack/react-query"; +import { delay } from "es-toolkit"; import { PlusIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; +import { useLoadingStore } from "~/components/gloabl-loading"; import { createInvitation } from "~/lib/db/schema/invitations.query"; import type { Template } from "~/lib/db/schema/templates"; export default function TemplateItem({ template }: { template: Template }) { const router = useRouter(); + const loadingLayer = useLoadingStore(); const createMutation = useMutation({ mutationFn: async () => { - // TODO: global loading - return await createInvitation({ - title: template.title, - thumbnailUrl: template.thumbnailUrl, - customFields: template.customFields, - }); + loadingLayer.open("초대장을 만들고 있어요..."); + + const [data] = await Promise.all([ + await createInvitation({ + title: template.title, + thumbnailUrl: template.thumbnailUrl, + customFields: template.customFields, + }), + await delay(1000), + ]); + + return data; }, onSuccess: (data) => { toast.success("초대장이 생성되었습니다."); router.push(`/i/${data.eventUrl}/edit`); + loadingLayer.close(); }, onError: (error) => { console.error("Error creating invitation:", error); toast.error("초대장 생성 중 오류가 발생했습니다."); + loadingLayer.close(); }, }); diff --git a/src/app/(main)/loading.tsx b/src/app/(main)/loading.tsx new file mode 100644 index 00000000..921a89ab --- /dev/null +++ b/src/app/(main)/loading.tsx @@ -0,0 +1,25 @@ +export default function Loading() { + return ( +
+
+ + Loading... +
+
+ ); +} diff --git a/src/components/core/in-view.tsx b/src/components/core/in-view.tsx new file mode 100644 index 00000000..285ba612 --- /dev/null +++ b/src/components/core/in-view.tsx @@ -0,0 +1,50 @@ +"use client"; + +import { + motion, + type Transition, + useInView, + type UseInViewOptions, + type Variant, +} from "framer-motion"; +import { type ReactNode, useRef } from "react"; + +interface InViewProps { + children: ReactNode; + variants?: { + hidden: Variant; + visible: Variant; + }; + transition?: Transition; + viewOptions?: UseInViewOptions; + className?: string; +} + +const defaultVariants = { + hidden: { opacity: 0 }, + visible: { opacity: 1 }, +}; + +export function InView({ + children, + variants = defaultVariants, + transition, + viewOptions, + className, +}: InViewProps) { + const ref = useRef(null); + const isInView = useInView(ref, viewOptions); + + return ( + + {children} + + ); +} diff --git a/src/components/core/text-effect.tsx b/src/components/core/text-effect.tsx new file mode 100644 index 00000000..3ea3e49b --- /dev/null +++ b/src/components/core/text-effect.tsx @@ -0,0 +1,147 @@ +"use client"; + +import { motion, type Variants } from "framer-motion"; +import React from "react"; + +type PresetType = "blur" | "shake" | "scale" | "fade" | "slide"; + +type TextEffectProps = { + children: string; + per?: "word" | "char"; + as?: keyof JSX.IntrinsicElements; + variants?: { + container?: Variants; + item?: Variants; + }; + className?: string; + preset?: PresetType; +}; + +const defaultContainerVariants: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.05, + }, + }, +}; + +const defaultItemVariants: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + }, +}; + +const presetVariants: Record< + PresetType, + { container: Variants; item: Variants } +> = { + blur: { + container: defaultContainerVariants, + item: { + hidden: { opacity: 0, filter: "blur(12px)" }, + visible: { opacity: 1, filter: "blur(0px)" }, + }, + }, + shake: { + container: defaultContainerVariants, + item: { + hidden: { x: 0 }, + visible: { x: [-5, 5, -5, 5, 0], transition: { duration: 0.5 } }, + }, + }, + scale: { + container: defaultContainerVariants, + item: { + hidden: { opacity: 0, scale: 0 }, + visible: { opacity: 1, scale: 1 }, + }, + }, + fade: { + container: defaultContainerVariants, + item: { + hidden: { opacity: 0 }, + visible: { opacity: 1 }, + }, + }, + slide: { + container: defaultContainerVariants, + item: { + hidden: { opacity: 0, y: 20 }, + visible: { opacity: 1, y: 0 }, + }, + }, +}; + +const AnimationComponent: React.FC<{ + word: string; + variants: Variants; + per: "word" | "char"; +}> = React.memo(({ word, variants, per }) => { + if (per === "word") { + return ( + + ); + } + + return ( + + {word.split("").map((char, charIndex) => ( + + ))} + + ); +}); + +AnimationComponent.displayName = "AnimationComponent"; + +export function TextEffect({ + children, + per = "word", + as = "p", + variants, + className, + preset, +}: TextEffectProps) { + const words = children.split(/(\S+)/); + const MotionTag = motion[as as keyof typeof motion]; + const selectedVariants = preset + ? presetVariants[preset] + : { container: defaultContainerVariants, item: defaultItemVariants }; + const containerVariants = variants?.container || selectedVariants.container; + const itemVariants = variants?.item || selectedVariants.item; + + return ( + + {words.map((word, wordIndex) => ( + + ))} + + ); +} diff --git a/src/components/editor/navigation.tsx b/src/components/editor/navigation.tsx index 625b5e25..241bc266 100644 --- a/src/components/editor/navigation.tsx +++ b/src/components/editor/navigation.tsx @@ -13,7 +13,7 @@ import { Undo2, } from "lucide-react"; import Link from "next/link"; -import { useParams, useRouter } from "next/navigation"; +import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { useEditor } from "~/components/editor/provider"; import TitleInput from "~/components/editor/title-input"; @@ -38,8 +38,6 @@ export default function EditorNavigation() { const { editor, dispatch } = useEditor(); const router = useRouter(); const { openDialog } = useAlertDialogStore(); - const params = useParams(); - const subDomain = params.subdomain; const handlePreviewClick = () => { dispatch({ type: "TOGGLE_PREVIEW_MODE" }); @@ -54,19 +52,18 @@ export default function EditorNavigation() { }; const handleOnSave = async () => { - try { - await updateInvitation({ + toast.promise( + updateInvitation({ id: editor.config.invitationId, title: editor.config.invitationTitle, customFields: editor.data, - }); - toast.success("저장되었습니다."); - } catch (error) { - console.error(error); - toast.error("일시적인 오류가 발생되었습니다.", { - description: "잠시후 다시 시도해보세요.", - }); - } + }), + { + loading: "저장중...", + success: "저장되었습니다.", + error: "일시적인 오류가 발생되었습니다.", + }, + ); }; const handleOnDelete = () => { @@ -78,6 +75,7 @@ export default function EditorNavigation() { onConfirm: async () => { await deleteInvitation(editor.config.invitationId); router.replace("/dashboard"); + toast.success("삭제되었습니다."); }, }); }; diff --git a/src/components/editor/sidebar/sidebar-settings-tab.tsx b/src/components/editor/sidebar/sidebar-settings-tab.tsx index f64fcbab..123fa26a 100644 --- a/src/components/editor/sidebar/sidebar-settings-tab.tsx +++ b/src/components/editor/sidebar/sidebar-settings-tab.tsx @@ -118,10 +118,7 @@ function CustomDomainSection() { type="submit" size="sm" className="ml-2 h-6" - disabled={ - updateSubdomainMutation.isPending || - field.state.value === editor.config.invitationSubdomain - } + disabled={updateSubdomainMutation.isPending} > 저장 diff --git a/src/components/gloabl-loading.tsx b/src/components/gloabl-loading.tsx new file mode 100644 index 00000000..ea6a25d2 --- /dev/null +++ b/src/components/gloabl-loading.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { AnimatePresence, motion } from "framer-motion"; +import { create } from "zustand"; +import { TextEffect } from "~/components/core/text-effect"; + +type LoadingStore = { + text?: string; + isOpen: boolean; + open: (text?: string) => void; + close: () => void; +}; + +export const useLoadingStore = create((set) => ({ + isOpen: false, + open: (text) => set({ isOpen: true, text }), + close: () => set({ isOpen: false }), +})); + +export default function GlobalLoading() { + const { text, isOpen } = useLoadingStore(); + + return ( + + {isOpen && ( + + 로딩중... + {text && ( + {text} + )} + + )} + + ); +} diff --git a/src/components/providers.tsx b/src/components/providers.tsx index 3db6be6b..92479bd4 100644 --- a/src/components/providers.tsx +++ b/src/components/providers.tsx @@ -3,6 +3,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import type { ReactNode } from "react"; +import GlobalLoading from "~/components/gloabl-loading"; import { GlobalAlert } from "~/components/global-alert"; import { Toaster } from "~/components/ui/sonner"; import { TooltipProvider } from "~/components/ui/tooltip"; @@ -45,6 +46,7 @@ export default function Providers({ children }: { children: ReactNode }) { {children} + ); diff --git a/tailwind.config.ts b/tailwind.config.ts index 08e0a003..1e4c0293 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -75,11 +75,35 @@ const config = { transform: "scale(1)", }, }, + "head-shake": { + "0%": { + transform: "translateX(0)", + }, + "6.5%": { + transform: "translateX(-6px) rotateY(-9deg)", + }, + + "18.5%": { + transform: "translateX(5px) rotateY(7deg)", + }, + + "31.5%": { + transform: "translateX(-3px) rotateY(-5deg)", + }, + + "43.5%": { + transform: "translateX(2px) rotateY(3deg)", + }, + "50%": { + transform: "translateX(0)", + }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", "zoom-in": "zoom-in 0.5s ease-out", + "head-shake": "head-shake 2s infinite", }, }, },