diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..de28cbb5 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,40 @@ +name-template: "v$RESOLVED_VERSION ๐ŸŒˆ" ## ๋ฆด๋ฆฌ์ฆˆ ์ œ๋ชฉ +tag-template: "v$RESOLVED_VERSION" ## ํƒœ๊ทธ +categories: + - title: "๐Ÿš€ Features" + labels: + - "Bookmark ๐Ÿ”–" + - "โœจ Feat" + - "PoseFeed ๐Ÿงฉ" + - "PosePick ๐Ÿƒ" + - "PoseTalk ๐Ÿ’ฌ" + - "๐Ÿ’„ Style" + - title: "๐Ÿ› Bug Fixes" + labels: + - "๐Ÿ›  Fix" + - title: "๐Ÿงฐ Maintenance" + labels: + - "โ™ป๏ธ Refactor" +change-template: "- $TITLE @$AUTHOR (#$NUMBER)" +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - "major" + minor: + labels: + - "minor" + patch: + labels: + - "patch" + default: patch +template: | # ๋ฆด๋ฆฌ์ฆˆ ๋‚ด์šฉ + ## Changes (v$RESOLVED_VERSION) + + $CHANGES + + ## Previos Tag + $PREVIOUS_TAG + + ## Contributors + $CONTRIBUTORS \ No newline at end of file diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 00000000..9b12e90c --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,20 @@ +name: Release Drafter + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + update_release_draft: + permissions: + contents: write + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/public/images/main_star.png b/public/images/main_star.png new file mode 100644 index 00000000..c1677114 Binary files /dev/null and b/public/images/main_star.png differ diff --git a/public/images/main.png b/public/images/main_wand.png similarity index 100% rename from public/images/main.png rename to public/images/main_wand.png diff --git a/public/pwa-icons/icon-128x128.png b/public/pwa-icons/icon-128x128.png index dfb52edf..9a2cc53a 100644 Binary files a/public/pwa-icons/icon-128x128.png and b/public/pwa-icons/icon-128x128.png differ diff --git a/public/pwa-icons/icon-144x144.png b/public/pwa-icons/icon-144x144.png index 2419a2e7..1586d5da 100644 Binary files a/public/pwa-icons/icon-144x144.png and b/public/pwa-icons/icon-144x144.png differ diff --git a/public/pwa-icons/icon-152x152.png b/public/pwa-icons/icon-152x152.png index bff4f63b..849cd901 100644 Binary files a/public/pwa-icons/icon-152x152.png and b/public/pwa-icons/icon-152x152.png differ diff --git a/public/pwa-icons/icon-192x192.png b/public/pwa-icons/icon-192x192.png index 831ba043..85865f8c 100644 Binary files a/public/pwa-icons/icon-192x192.png and b/public/pwa-icons/icon-192x192.png differ diff --git a/public/pwa-icons/icon-384x384.png b/public/pwa-icons/icon-384x384.png index 82c38249..514e900d 100644 Binary files a/public/pwa-icons/icon-384x384.png and b/public/pwa-icons/icon-384x384.png differ diff --git a/public/pwa-icons/icon-48x48.png b/public/pwa-icons/icon-48x48.png index 8eaf9222..ead96f01 100644 Binary files a/public/pwa-icons/icon-48x48.png and b/public/pwa-icons/icon-48x48.png differ diff --git a/public/pwa-icons/icon-512x512.png b/public/pwa-icons/icon-512x512.png index 260e0c5e..a427a4af 100644 Binary files a/public/pwa-icons/icon-512x512.png and b/public/pwa-icons/icon-512x512.png differ diff --git a/public/pwa-icons/icon-72x72.png b/public/pwa-icons/icon-72x72.png index ddeb74c8..a27cae6b 100644 Binary files a/public/pwa-icons/icon-72x72.png and b/public/pwa-icons/icon-72x72.png differ diff --git a/public/pwa-icons/icon-96x96.png b/public/pwa-icons/icon-96x96.png index 08c9422a..3994ff32 100644 Binary files a/public/pwa-icons/icon-96x96.png and b/public/pwa-icons/icon-96x96.png differ diff --git a/src/app/(Main)/components/MainHeader.tsx b/src/app/(Main)/components/MainHeader.tsx index a6e46f9d..4a049847 100644 --- a/src/app/(Main)/components/MainHeader.tsx +++ b/src/app/(Main)/components/MainHeader.tsx @@ -1,4 +1,5 @@ import Image from 'next/image'; +import Link from 'next/link'; import Tab from './Tab'; import { Header } from '@/components/Header'; @@ -6,7 +7,11 @@ import { Header } from '@/components/Header'; export default function MainHeader() { return (
PosePicker} + leftNode={ + +

PosePicker

+ + } rightNode={24} headerDownNode={} className="px-20" diff --git a/src/app/(Main)/feed/components/Photo.tsx b/src/app/(Main)/feed/components/Photo.tsx index f28d98bf..f050e575 100644 --- a/src/app/(Main)/feed/components/Photo.tsx +++ b/src/app/(Main)/feed/components/Photo.tsx @@ -1,6 +1,9 @@ +'use client'; import Image from 'next/image'; import Link from 'next/link'; +import { Popup } from '@/components/Modal'; +import { useOverlay } from '@/components/Overlay/useOverlay'; import { ICON } from '@/constants/icon'; interface Photo { @@ -10,14 +13,39 @@ interface Photo { } export default function Photo({ imageKey, source, id }: Photo) { + const { open } = useOverlay(); return (
{imageKey && ( <> - {source} + {source
- ๐Ÿ”– + ๐Ÿ”– { + e.preventDefault(); + open(({ exit }) => ( + +

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์•„์ง ์ค€๋น„์ค‘์ด์—์š”!

+

์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋Œ€ํ•ด ์ฃผ์„ธ์š”.

+
+ )); + }} + />
)} diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 3a9855ef..fb7df97f 100644 Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 94f5ac20..930b8c6c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -13,7 +13,7 @@ import type { Metadata } from 'next'; const DEFAULT_OG_TITLE = 'PosePicker'; const DEFAULT_OG_DESC = 'ํฌํ† ๋ถ€์Šค์—์„œ ๊ณ ๋ฏผํ•˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•œ ํฌ์ฆˆ ์ถ”์ฒœ'; -const DEFAULT_OG_IMAGE = '/images/main.png'; +const DEFAULT_OG_IMAGE = '/images/main_star.png'; export const metadata: Metadata = { metadataBase: new URL(BASE_SITE_URL), diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index a9d2360a..b993e50d 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -1,14 +1,23 @@ import ModalWrapper from './PortalWrapper'; import { StrictPropsWithChildren } from '@/types'; -interface PopupProps { +interface PopupProps extends React.HTMLAttributes { className?: string; + onCloseOutside?: () => void; } -export default function Popup({ className, children }: StrictPropsWithChildren) { +export default function Popup({ + className, + children, + onCloseOutside, + ...props +}: StrictPropsWithChildren) { return ( - -
+ +
{children}
diff --git a/src/components/Modal/PortalWrapper.tsx b/src/components/Modal/PortalWrapper.tsx index 7f603cdf..b75f7232 100644 --- a/src/components/Modal/PortalWrapper.tsx +++ b/src/components/Modal/PortalWrapper.tsx @@ -7,7 +7,7 @@ import { useOnClickOutside } from '@/hooks/useOnClickOutside'; import type { StrictPropsWithChildren } from '@/types'; -interface PortalWrapperProps { +interface PortalWrapperProps extends React.HTMLAttributes { onClose?: () => void; isBackGroundBlur?: boolean; className?: string; @@ -18,6 +18,7 @@ export default function PortalWrapper({ children, isBackGroundBlur = true, className, + ...props }: StrictPropsWithChildren) { const portalRef = useRef(null); @@ -35,6 +36,7 @@ export default function PortalWrapper({ }, className )} + {...props} > {children}
diff --git a/src/components/Overlay/useOverlay.tsx b/src/components/Overlay/useOverlay.tsx index 7ae27156..ee313e31 100644 --- a/src/components/Overlay/useOverlay.tsx +++ b/src/components/Overlay/useOverlay.tsx @@ -8,9 +8,10 @@ let elementId = 1; interface Options { exitOnUnmount?: boolean; + delay?: number; } -export function useOverlay({ exitOnUnmount = true }: Options = {}) { +export function useOverlay({ exitOnUnmount = true, delay }: Options = {}) { const context = useContext(OverlayContext); if (context == null) { @@ -44,6 +45,11 @@ export function useOverlay({ exitOnUnmount = true }: Options = {}) { }} /> ); + if (!delay) return; + const timer = setTimeout(() => { + unmount(id); + }, delay); + return () => clearTimeout(timer); }, close: () => { overlayRef.current?.close(); @@ -52,6 +58,6 @@ export function useOverlay({ exitOnUnmount = true }: Options = {}) { unmount(id); }, }), - [id, mount, unmount] + [delay, id, mount, unmount] ); } diff --git a/src/components/WaitingToast/WaitingToast.tsx b/src/components/WaitingToast/WaitingToast.tsx new file mode 100644 index 00000000..94553165 --- /dev/null +++ b/src/components/WaitingToast/WaitingToast.tsx @@ -0,0 +1,13 @@ +interface WaitingToastProps { + onClose: () => void; +} +export default function WaitingToast({ onClose }: WaitingToastProps) { + return ( +
+ ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค. ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค ์ฃผ์„ธ์š”! +
+ ); +} diff --git a/src/components/WaitingToast/index.ts b/src/components/WaitingToast/index.ts new file mode 100644 index 00000000..3618cbab --- /dev/null +++ b/src/components/WaitingToast/index.ts @@ -0,0 +1 @@ +export { default as WaitingToast } from './WaitingToast'; diff --git a/src/hooks/useKakaoShare.ts b/src/hooks/useKakaoShare.ts index 20781369..ef929514 100644 --- a/src/hooks/useKakaoShare.ts +++ b/src/hooks/useKakaoShare.ts @@ -23,8 +23,8 @@ export default function useKakaoShare() { kakao.Link.sendDefault({ objectType: 'feed', content: { - title: 'ํฌ์ฆˆ๋ฅผ ๋ฝ‘์•„๋ด !', - description: '๋‹น์‹ ์—๊ฒŒ ์–ด์šธ๋ฆฌ๋Š” ํฌ์ฆˆ๋ฅผ ์ถ”์ฒœํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.', + title: 'PosePicker', + description: 'ํฌํ† ๋ถ€์Šค์—์„œ ๊ณ ๋ฏผํ•˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•œ ํฌ์ฆˆ ์ถ”์ฒœ', imageUrl: 'https://github.com/gloddy-dev/gloddy-client/assets/62178788/a145c7ca-b487-4b2a-9913-cc1589e44f91', link: {