From e08172f4a75e021e1890c9d31927518b23c6897d Mon Sep 17 00:00:00 2001 From: codytseng Date: Wed, 25 Jun 2025 23:00:45 +0800 Subject: [PATCH] feat: update favicon --- public/apple-touch-icon.png | Bin 778 -> 5817 bytes public/favicon-96x96.png | Bin 0 -> 2861 bytes public/favicon.ico | Bin 668 -> 15086 bytes public/favicon.svg | 2 +- src/providers/NotificationProvider.tsx | 39 ++++++++++++++++++++++++- 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 public/favicon-96x96.png diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index b494b44a9c3d70bcd4650db26de5a1f85940c499..8d0a6c0ef042b5bd416a96397e53a221d8771dd4 100644 GIT binary patch literal 5817 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 literal 778 zcmeAS@N?(olHy`uVBq!ia0vp^TR@ltNH9n&i+l&97>k44ofy`glX=O&z;wjZ#WAGf z*4tZ-c`AwmE*CAL?&|S z=6BZ?tY*8r)-jxSS9J3_sgmt%v8FHbcz0!8xGPn1b-`}a7xUW_tW6jdZgBU8r^uUp z)K7CZVc6#IxOj=}EP;zMvJ)y7D=s#jC42Egi=m$*2m|LyhI^Xf|?_uQ{yOp4uo8BvQDZoZeO zl(NOm-QA?*+U{j7J=Zc`T$1!Xai}VI?u3g{ymP;PWL5lZSKQeLw5R_GhveFe7nT~& zx)3@4hL90RyPdRp%02d97X^VzYx#i|nUuWjQ7gH2y%DT7GJcOz%DwGJ7b#0wy*}Ln zGC#&WJuZ65_lpcoXLfIPUYzY{pl{pu`-S+N-^{fFz5Z7}?C5*;c>30syt{7i&-69F zsNiYP<6pG!(K)4BzO|e`WzN2SG1v8%f>m8+*$0(h8yVKUxKqI+y{J-XZa}WirE?ih z+x-^(oWLME_hL()<>G~lnXRVx$-QXNn#OlQH@U>{!uI>ii<1}dFZ%l9=rIR**Y!&p zG&b{EwYqzAeGW7^YQW{)Cj9GbyyX2Xp{YN=yb`Q2cMsy(%xuNj@c#Nl4%KVVF5gZP z$(qPLOMW?%`5E&IKkXZIFK8>?kbbuKh3Jh`{fmlUn7-YJSrq)DB_V%C|H4*-xHpGn zy-S$ZUR8KH|Eu?R(Jjw3x0%H|Wy=Pi5i(rpzi4aJc_Fc9(HUpirk6Yyigna)OR6tz zH@NTc`rx%Zy^E|{lCsNS?3?f;J0o_IVExX6HA>(1 i=zd#BY$5}u#@GC2PFFJieF_JqbOujXKbLh*2~7Z-p>6yC diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b391ca64b450b65e07b6b195724eca1c5ade58 GIT binary patch literal 2861 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 LNkvXXu0mjf&vguZM9?QyN#aXp$TdIt= z)>W~r29{;T$EUm(w5)%sx`L|Y`_QbGHB&YCi)y2~SOZk1K8PeD)m8qR%73bSMdjBj ze^)uJiN3%97BGQbJqTLuFci#RRZdblqY}7&wbPK6X9XiceMM=yaA>o_O+nkqTgetZ{NPj{{8zk z-KxKkfBEGX$(=j5v~1Z@Hf-1+SFT)qiy51}EKs0;o{LYP zKKURqYSSbI-%>5G38JR2U%$$hEn6gK&YS|>Wy+M1zJ2@3!Gj02oL8$>O|oUnrsu;> zv;7(QLbi}A;02V7Jrfn&!-o&0MvWR$vSdl=)~%cD+__U0Em|a%D_7RC51r5#7Z;Z* zGj`g|GwY;Tvt|OkfReGrqJm3GN|JW%+UfaUwrrWyu3bBo-|)R$xpLC8XHOYFe!Pqr zF+!LR#$xEUmxT)#7Gy0TIWl%+RQfMoyr^+@>Cz=czR^8Rn>N)l@%r^^tz)3;?Afz= z{W2$Z+IePN^tpHMUR0bOKN=f2YI9`2Y}v9}MhrdB79SrkCr+FY^pZXCe&E0X$(uKC z1pV|cQlyCN*s()CfBtOmmX>Ev_WR($gF|SC24uN)>(=t>)hkE5=&Lqu+BnkB9Q5kd zOP)S`>e$yurKe40(4avPbfAZj`41mHxT0e(K*r3R*-Pf`{Q2`i?`w{D|i%;Cg|6J2#c1R-gxz}_4;Zk*l&E?v4LZ{ED|3<QOt1j)_ zxwA0GnKdCpH*en5c9M}Bd&xRxuL#)336ve|69Wbea9qduKC-2| zmQ4@7p!>2uvDxrH4bAov|BgBGnLOE`K4H2xfAZvsG;iMA)h1fLe7PSz1nuqyq$?F^ z|A2o+90PmA&U^FRqD70SHfMBi0h#ga(acNK^Sl3yAk&V)6YaJ! zWF}d1JaaU(x|M3uSkoD&>A8M()SD@4CL(dD;J!8GSh=G+7O zH9h`=vEPjy>HGeSBwH2{Zb?-4gjD&RLH*sbzEU=`tdErCE$by^0n19J%wbtclyUzp z6M4^KS*GOm|0yLh7~A-gc(;u|nRmq(!zaTx!$-qc!)L>H?rFuV{8yFJa!*UiPn^mF zR9>(0ZI%5T@Y0q(^aX|*k@uw9|EBW4R1PWu>$g}Gs5Zq^-W3#52ROhk=0peeD*wZw zPtaB1h@e5$xsIFo26i83Z^UZIoNr;Pr!h9U%gzIZoB57N_+!MVITz-Pwo;`^+P^Pd zy0i=(I#hP;+9g}JZk3lWU&gXaBVelvEf1P*}WI^E7pLm`K}ne`n~$;-BF+k}`&Vq&87?%i9*wur58H-vZ={+a#kkZ)_&tnoV! zMz=)ZU%h&@#tklFn8atfM?f6y@#DubdGcht*Ch4;uBG2rlf3GjeBZt%dq z7G}+wmF{yZ&Ssl5X`=DYo;_Q~(8GOSc)%GS`pEDKdEg!hKC}-xh!{U(g}?w3jJv202)|7+(XQW1h3ImW)7f(Sp2nX*D?aVo}(Ev zW~9ym_&GmChoxr@{1AWU%$bNe=-$11hRp%`kh?ebIY4)xK7BgYFkE$Dtd92Y@Ok_8 z?V9gK4$&VICQOL7FB?164k}I0td+ZW?}o(h*^?SIY836_<-;y=K<8tN*Ry2+dSXp?tE6 zG9;Co=Z+n*7vos_tAOyf7Cl9U>KV9XY3_x#10)g=>G#aZ!BNFyc|7x z)C~q>NgXftE%z_EyM?Z)Teq&(b=0|>Pp0;TfO_@nX`goe`t@2z96EGJ-~Y#E;Vw+9 zRKI?GZRf9Bw@&L9&fd8*i48hz*su^k$q5$w^qxI?=ekZ=w%<{|#CvP2~Up literal 668 zcmZQzU}RusFfd>MgC9WB42TsJz+8qiKuV91fk8k3!e0cWegXNN0eF0ZGD zOAwF-nP9-e3?!H8JlO)I7>k44ofy`glX(f`@CW#WxB_Wp;LrEG7szKR3GxeOaA?@S zIOHx5kl*g<;uunK>*<7zf`=6ZSXhG?BOWtJ{9#Q9SJ=Pp|16OSoyrQ=+V>y4clXm4 z?n(x;E;hDOmQ5@Tf7}b+$~BtHTz+R#Fn{yHXLqGq>L$crddG49*}wY^zazx6TAkZ& zE!Y;YDxz4s{i}k@3C0!W4+I1Dp0!`FEcTFVdQ&MBb@i@z0s(h6XIH-@Ai2Xe^ucQnM`d(Um;J)pqj5}1?9ATHUUBB!97 zQ1bhH%L@zhk{vah_N|*^x0X}pSOW{!6qdOUolc+K)mU51c+gn5ci+mD9C=(yrn1kp zJ<1!>?gsa`?>%U|f4|IL#>2IIl?%NRE&-i~&o7`@76AL@?cGP9NF~=Vh7i9bE3iyS z;1Sn2`-COc;IM=aUxL>}M^{D{V=L#YMpB2btXkn9>2r+f$698FyM4?Vxx4<&Ms^_p DPKU@< diff --git a/public/favicon.svg b/public/favicon.svg index fe412aa..0cb187d 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/providers/NotificationProvider.tsx b/src/providers/NotificationProvider.tsx index a56aead..8cccfaf 100644 --- a/src/providers/NotificationProvider.tsx +++ b/src/providers/NotificationProvider.tsx @@ -68,7 +68,12 @@ export function NotificationProvider({ children }: { children: React.ReactNode } !mutePubkeys.includes(evt.pubkey) && (!hideUntrustedNotifications || isUserTrusted(evt.pubkey)) ) { - setNewNotificationIds((prev) => new Set([...prev, evt.id])) + setNewNotificationIds((prev) => { + if (prev.has(evt.id)) { + return prev + } + return new Set([...prev, evt.id]) + }) } }, onclose: (reasons) => { @@ -127,11 +132,43 @@ export function NotificationProvider({ children }: { children: React.ReactNode } useEffect(() => { const newNotificationCount = newNotificationIds.size + + // Update title if (newNotificationCount > 0) { document.title = `(${newNotificationCount >= 10 ? '9+' : newNotificationCount}) Jumble` } else { document.title = 'Jumble' } + + // Update favicons + const favicons = document.querySelectorAll("link[rel*='icon']") + if (!favicons.length) return + + if (newNotificationCount === 0) { + favicons.forEach((favicon) => { + favicon.href = '/favicon.ico' + }) + } else { + const img = document.createElement('img') + img.src = '/favicon.ico' + img.onload = () => { + const size = Math.max(img.width, img.height, 32) + const canvas = document.createElement('canvas') + canvas.width = size + canvas.height = size + const ctx = canvas.getContext('2d') + if (!ctx) return + ctx.drawImage(img, 0, 0, size, size) + const r = size * 0.16 + ctx.beginPath() + ctx.arc(size - r - 6, r + 6, r, 0, 2 * Math.PI) + ctx.fillStyle = '#FF0000' + ctx.fill() + favicons.forEach((favicon) => { + favicon.href = canvas.toDataURL('image/png') + }) + } + } }, [newNotificationIds]) const getNotificationsSeenAt = () => {