diff --git a/.github/workflows/share-extension.yml b/.github/workflows/share-extension.yml new file mode 100644 index 00000000..91b6c759 --- /dev/null +++ b/.github/workflows/share-extension.yml @@ -0,0 +1,37 @@ +name: πŸ“¦ Share Pinback Extension + +on: + workflow_dispatch: + inputs: + branch: + description: 'λΉŒλ“œν•  브랜치λ₯Ό ν™•μΈν•˜μ„Έμš” (κΈ°λ³Έ: develop)' + required: true + default: 'develop' + +jobs: + build-and-send: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.branch }} + + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build and Share Extension + env: + VITE_DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + run: pnpm share:ext diff --git a/packages/design-system/src/icons/source/chippi_profile.svg b/apps/client/public/assets/chippi_profile.svg similarity index 100% rename from packages/design-system/src/icons/source/chippi_profile.svg rename to apps/client/public/assets/chippi_profile.svg diff --git a/packages/design-system/src/icons/source/palms.svg b/apps/client/public/assets/palms.svg similarity index 100% rename from packages/design-system/src/icons/source/palms.svg rename to apps/client/public/assets/palms.svg diff --git a/packages/design-system/src/icons/source/tooltip_1.svg b/apps/client/public/assets/tooltip_1.svg similarity index 100% rename from packages/design-system/src/icons/source/tooltip_1.svg rename to apps/client/public/assets/tooltip_1.svg diff --git a/packages/design-system/src/icons/source/tooltip_2.svg b/apps/client/public/assets/tooltip_2.svg similarity index 100% rename from packages/design-system/src/icons/source/tooltip_2.svg rename to apps/client/public/assets/tooltip_2.svg diff --git a/packages/design-system/src/icons/source/tooltip_3.svg b/apps/client/public/assets/tooltip_3.svg similarity index 100% rename from packages/design-system/src/icons/source/tooltip_3.svg rename to apps/client/public/assets/tooltip_3.svg diff --git a/packages/design-system/src/icons/source/tooltip_4.svg b/apps/client/public/assets/tooltip_4.svg similarity index 100% rename from packages/design-system/src/icons/source/tooltip_4.svg rename to apps/client/public/assets/tooltip_4.svg diff --git a/packages/design-system/src/icons/source/tooltip_5.svg b/apps/client/public/assets/tooltip_5.svg similarity index 100% rename from packages/design-system/src/icons/source/tooltip_5.svg rename to apps/client/public/assets/tooltip_5.svg diff --git a/apps/client/src/pages/level/components/LevelInfoCard.tsx b/apps/client/src/pages/level/components/LevelInfoCard.tsx index fe6d287f..ba48bc71 100644 --- a/apps/client/src/pages/level/components/LevelInfoCard.tsx +++ b/apps/client/src/pages/level/components/LevelInfoCard.tsx @@ -1,15 +1,14 @@ -import { cn } from '@pinback/design-system/utils'; -import { Level } from '@pinback/design-system/ui'; -import { Icon, type IconName } from '@pinback/design-system/icons'; import { TREE_LEVEL_TABLE, TreeLevel } from '@pages/level/types/treeLevelType'; +import { Level } from '@pinback/design-system/ui'; +import { cn } from '@pinback/design-system/utils'; -const LEVEL_TOOLTIP_ICON = { - 1: 'tooltip_1', - 2: 'tooltip_2', - 3: 'tooltip_3', - 4: 'tooltip_4', - 5: 'tooltip_5', -} as const satisfies Record; +const LEVEL_TOOLTIP_IMAGE = { + 1: '/assets/tooltip_1.svg', + 2: '/assets/tooltip_2.svg', + 3: '/assets/tooltip_3.svg', + 4: '/assets/tooltip_4.svg', + 5: '/assets/tooltip_5.svg', +} as const satisfies Record; export default function LevelInfoCard() { const rows = [...TREE_LEVEL_TABLE].reverse(); @@ -33,12 +32,12 @@ export default function LevelInfoCard() { >
-
diff --git a/apps/client/src/pages/myBookmark/components/footer/Footer.tsx b/apps/client/src/pages/myBookmark/components/footer/Footer.tsx index 73669922..fe69ac3c 100644 --- a/apps/client/src/pages/myBookmark/components/footer/Footer.tsx +++ b/apps/client/src/pages/myBookmark/components/footer/Footer.tsx @@ -52,7 +52,13 @@ const Footer = () => { aria-label="Pinback λΈ”λ‘œκ·Έ" className="transition-opacity hover:opacity-80" > - + Palms 둜고
diff --git a/apps/client/src/pages/onBoarding/components/footer/Footer.tsx b/apps/client/src/pages/onBoarding/components/footer/Footer.tsx index 1140e056..0c8b549e 100644 --- a/apps/client/src/pages/onBoarding/components/footer/Footer.tsx +++ b/apps/client/src/pages/onBoarding/components/footer/Footer.tsx @@ -52,7 +52,13 @@ const Footer = () => { aria-label="Pinback λΈ”λ‘œκ·Έ" className="transition-opacity hover:opacity-80" > - + Palms 둜고 diff --git a/apps/client/src/pages/remind/components/footer/Footer.tsx b/apps/client/src/pages/remind/components/footer/Footer.tsx index 73669922..fe69ac3c 100644 --- a/apps/client/src/pages/remind/components/footer/Footer.tsx +++ b/apps/client/src/pages/remind/components/footer/Footer.tsx @@ -52,7 +52,13 @@ const Footer = () => { aria-label="Pinback λΈ”λ‘œκ·Έ" className="transition-opacity hover:opacity-80" > - + Palms 둜고 diff --git a/apps/client/src/shared/components/sidebar/MyLevelItem.tsx b/apps/client/src/shared/components/sidebar/MyLevelItem.tsx index 442d41f6..d60b4d34 100644 --- a/apps/client/src/shared/components/sidebar/MyLevelItem.tsx +++ b/apps/client/src/shared/components/sidebar/MyLevelItem.tsx @@ -1,4 +1,3 @@ -import { Icon } from '@pinback/design-system/icons'; import { Level, Progress } from '@pinback/design-system/ui'; import { cn } from '@pinback/design-system/utils'; import { getTreeLevel } from '@shared/utils/treeLevel'; @@ -34,11 +33,12 @@ export default function MyLevelItem({ className="flex size-[4.6rem] items-center justify-center" aria-hidden > - diff --git a/apps/extension/.gitignore b/apps/extension/.gitignore index 7a22cca6..20337dff 100644 --- a/apps/extension/.gitignore +++ b/apps/extension/.gitignore @@ -24,3 +24,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# build output +out/ \ No newline at end of file diff --git a/apps/extension/package.json b/apps/extension/package.json index 84779808..cb302df6 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -10,7 +10,8 @@ "build:prod": "tsc -b && vite build --mode production", "lint": "eslint .", "format": "prettier -w .", - "zip": "pnpm build:prod && node scripts/zip.mjs" + "zip": "pnpm build:prod && node scripts/zip.mjs", + "share:dev": "pnpm build:dev && node --env-file=.env.development scripts/zip.mjs" }, "dependencies": { "@pinback/contracts": "workspace:*", @@ -32,12 +33,14 @@ "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react-swc": "^4.0.0", + "adm-zip": "^0.5.16", "autoprefixer": "^10.4.21", "eslint": "^9.33.0", "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", + "form-data": "^4.0.5", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.8", "tailwindcss": "^4.1.12", diff --git a/apps/extension/scripts/zip.mjs b/apps/extension/scripts/zip.mjs new file mode 100644 index 00000000..7ebb5f1f --- /dev/null +++ b/apps/extension/scripts/zip.mjs @@ -0,0 +1,86 @@ +/* global process */ +import AdmZip from 'adm-zip'; +import axios from 'axios'; +import FormData from 'form-data'; +import fs from 'fs'; +import path from 'path'; + +const WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL; // eslint-disable-line +const DIST_DIR = path.resolve('dist'); +const OUT_DIR = path.resolve('out'); +const ZIP_NAME = 'pinback-ext-dev.zip'; +const ZIP_PATH = path.join(OUT_DIR, ZIP_NAME); + +const getTimestamp = () => + new Date().toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' }); + +const createTemplate = (type, details) => { + const { time, fileName, error } = details; + const divider = '━━━━━━━━━━━━━━━━━━━━'; + + if (type === 'success') { + return `πŸ“¦ **Pinback ν™•μž₯ ν”„λ‘œκ·Έλž¨ λΉŒλ“œ μ™„λ£Œ**\n${divider}\n **λΉŒλ“œ μ‹œκ°„:** ${time}\n **파일λͺ…:** \`${fileName}\`\n\n μ΅œμ‹  λΉŒλ“œ 파일이 λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€. 압좕을 ν’€κ³  μ‚¬μš©ν•˜μ„Έμš”!`; + } + return `🚨 **Pinback λΉŒλ“œ 곡유 μ‹€νŒ¨**\n${divider}\n❌ **μ—λŸ¬ λ‚΄μš©:** ${error}\nπŸ•’ **λ°œμƒ μ‹œκ°„:** ${time}\n⚠️ 터미널 둜그λ₯Ό 확인해 μ£Όμ„Έμš”.`; +}; + +const archiveDist = () => { + if (!fs.existsSync(DIST_DIR)) { + throw new Error('dist 폴더가 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λΉŒλ“œλ₯Ό λ¨Όμ € μ‹€ν–‰ν•΄μ£Όμ„Έμš”.'); + } + + if (!fs.existsSync(OUT_DIR)) fs.mkdirSync(OUT_DIR, { recursive: true }); + if (fs.existsSync(ZIP_PATH)) fs.unlinkSync(ZIP_PATH); + + const zip = new AdmZip(); + zip.addLocalFolder(DIST_DIR); + zip.writeZip(ZIP_PATH); + + console.log(`βœ… μ••μΆ• μ™„λ£Œ: ${ZIP_PATH}`); +}; + +const uploadToDiscord = async (content, fileStream = null) => { + if (!WEBHOOK_URL) + throw new Error('DISCORD_WEBHOOK_URL이 μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.'); + + const form = new FormData(); + form.append('content', content); + if (fileStream) form.append('file', fileStream); + + await axios.post(WEBHOOK_URL, form, { headers: form.getHeaders() }); +}; + +async function run() { + try { + console.log('πŸ“¦ dist 폴더λ₯Ό μ••μΆ•ν•˜λŠ” 쀑...'); + archiveDist(); + + console.log('πŸ“€ λ””μŠ€μ½”λ“œλ‘œ 전솑 쀑...'); + const message = createTemplate('success', { + time: getTimestamp(), + fileName: ZIP_NAME, + }); + await uploadToDiscord(message, fs.createReadStream(ZIP_PATH)); + + console.log('βœ… λͺ¨λ“  μž‘μ—… 성곡!'); + } catch (err) { + const isPayloadTooLarge = err.response?.status === 413; + const errorMsg = isPayloadTooLarge + ? '파일 μš©λŸ‰μ΄ λ„ˆλ¬΄ ν½λ‹ˆλ‹€ (25MB μ œν•œ).' + : err.message; + + const failMessage = createTemplate('fail', { + time: getTimestamp(), + error: errorMsg, + }); + + await uploadToDiscord(failMessage).catch((e) => + console.error('❌ μ—λŸ¬ μ•Œλ¦Ό 전솑 μ‹€νŒ¨:', e.message) + ); + + console.error('❌ μž‘μ—… μ‹€νŒ¨:', errorMsg); + process.exitCode = 1; + } +} + +run(); diff --git a/apps/extension/src/pages/DuplicatePop.tsx b/apps/extension/src/pages/DuplicatePop.tsx index f4e359be..31255b20 100644 --- a/apps/extension/src/pages/DuplicatePop.tsx +++ b/apps/extension/src/pages/DuplicatePop.tsx @@ -1,31 +1,38 @@ -import { Icon } from "@pinback/design-system/icons"; -import extesionPop from '@assets/extension_pop.svg' +import extesionPop from '@assets/extension_pop.svg'; interface DuplicatePopProps { onLeftClick: () => void; onRightClick: () => void; } -const DuplicatePop = ({onLeftClick,onRightClick} : DuplicatePopProps) => { +const DuplicatePop = ({ onLeftClick, onRightClick }: DuplicatePopProps) => { return ( -
- -
μΉ˜μ‚κ°€ 이미 μ±™κ²¨λ’€μ–΄μš”!
-
- - -
-
- ) +
+ +
+ μΉ˜μ‚κ°€ 이미 μ±™κ²¨λ’€μ–΄μš”! 🌰 +
+
+ + +
+
+ ); }; -export default DuplicatePop; \ No newline at end of file +export default DuplicatePop; diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index c1c3d914..7f531556 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -39,6 +39,7 @@ export default defineConfig(({ mode }) => { build: { outDir: 'dist', copyPublicDir: true, + sourcemap: false, }, publicDir: 'public', diff --git a/apps/landing/public/palms.svg b/apps/landing/public/palms.svg new file mode 100644 index 00000000..05c75ebd --- /dev/null +++ b/apps/landing/public/palms.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/landing/src/components/Footer.tsx b/apps/landing/src/components/Footer.tsx index 9ce27bc1..0ed9dbaf 100644 --- a/apps/landing/src/components/Footer.tsx +++ b/apps/landing/src/components/Footer.tsx @@ -63,7 +63,13 @@ const Footer = () => { aria-label="Pinback λΈ”λ‘œκ·Έ" className="transition-opacity hover:opacity-80" > - + Palms 둜고 diff --git a/package.json b/package.json index 73cec766..20be52ff 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", "check-types": "turbo run check-types", - "test": "turbo run test" + "test": "turbo run test", + "share:ext": "pnpm --filter @pinback/extension share:dev" }, "devDependencies": { "@chromatic-com/storybook": "^4.1.1", diff --git a/packages/design-system/src/icons/iconNames.ts b/packages/design-system/src/icons/iconNames.ts index d989817e..a9839a4e 100644 --- a/packages/design-system/src/icons/iconNames.ts +++ b/packages/design-system/src/icons/iconNames.ts @@ -1,12 +1,8 @@ // 이 νŒŒμΌμ€ μžλ™ 생성 νŒŒμΌμž…λ‹ˆλ‹€. (직접 μˆ˜μ • κΈˆμ§€) export const iconNames = [ 'check_circle', - 'chippi_profile', - 'dotori', 'ext_home1', 'ext_home2', - 'extension_pop', - 'extension_thumb', 'google', 'ic_arrow_down_active', 'ic_arrow_down_disable', @@ -26,16 +22,8 @@ export const iconNames = [ 'ic_plus', 'instagram', 'logo', - 'logout_chippi.2512', 'main_header_logo', 'main_logo', 'notsave_circle', - 'palms', - 'saved', - 'tooltip_1', - 'tooltip_2', - 'tooltip_3', - 'tooltip_4', - 'tooltip_5', ] as const; export type IconName = (typeof iconNames)[number]; diff --git a/packages/design-system/src/icons/source/dotori.svg b/packages/design-system/src/icons/source/dotori.svg deleted file mode 100644 index 4b37ad54..00000000 --- a/packages/design-system/src/icons/source/dotori.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/design-system/src/icons/source/extension_pop.svg b/packages/design-system/src/icons/source/extension_pop.svg deleted file mode 100644 index 315ab09d..00000000 --- a/packages/design-system/src/icons/source/extension_pop.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/design-system/src/icons/source/extension_thumb.svg b/packages/design-system/src/icons/source/extension_thumb.svg deleted file mode 100644 index 32eb25f9..00000000 --- a/packages/design-system/src/icons/source/extension_thumb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/design-system/src/icons/source/logout_chippi.2512.svg b/packages/design-system/src/icons/source/logout_chippi.2512.svg deleted file mode 100644 index 56472b08..00000000 --- a/packages/design-system/src/icons/source/logout_chippi.2512.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/design-system/src/icons/source/saved.svg b/packages/design-system/src/icons/source/saved.svg deleted file mode 100644 index 315ab09d..00000000 --- a/packages/design-system/src/icons/source/saved.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 205b3994..f7fd86be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -239,6 +239,9 @@ importers: '@vitejs/plugin-react-swc': specifier: ^4.0.0 version: 4.0.0(@swc/helpers@0.5.17)(vite@7.1.2(@types/node@22.15.3)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.1)) + adm-zip: + specifier: ^0.5.16 + version: 0.5.16 autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -257,6 +260,9 @@ importers: eslint-plugin-react-refresh: specifier: ^0.4.20 version: 0.4.20(eslint@9.33.0(jiti@2.5.1)) + form-data: + specifier: ^4.0.5 + version: 4.0.5 prettier: specifier: ^3.3.3 version: 3.6.2 @@ -2230,6 +2236,10 @@ packages: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -3040,8 +3050,8 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} fraction.js@4.3.7: @@ -6915,6 +6925,8 @@ snapshots: acorn@8.15.0: {} + adm-zip@0.5.16: {} + agent-base@7.1.4: {} aggregate-error@3.1.0: @@ -7061,7 +7073,7 @@ snapshots: axios@1.11.0: dependencies: follow-redirects: 1.15.11 - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -7925,7 +7937,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.4: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8