@@ -403,6 +403,13 @@ const TimelineSection = ({
403403 const actionsDisabled = timelineType === "notifications" ;
404404 const emptyMessage = timelineType === "notifications" ? "표시할 알림이 없습니다." : "표시할 글이 없습니다." ;
405405
406+ useEffect ( ( ) => {
407+ if ( ! timeline . error ) {
408+ return ;
409+ }
410+ showToast ( timeline . error , { tone : "error" } ) ;
411+ } , [ showToast , timeline . error ] ) ;
412+
406413 useEffect ( ( ) => {
407414 const el = scrollRef . current ;
408415 if ( ! el ) {
@@ -475,6 +482,13 @@ const TimelineSection = ({
475482 refreshNotifications ( ) ;
476483 } , [ notificationsOpen , refreshNotifications ] ) ;
477484
485+ useEffect ( ( ) => {
486+ if ( ! notificationsError ) {
487+ return ;
488+ }
489+ showToast ( notificationsError , { tone : "error" } ) ;
490+ } , [ notificationsError , showToast ] ) ;
491+
478492 const handleToggleFavourite = async ( status : Status ) => {
479493 if ( ! account ) {
480494 onError ( "계정을 선택해주세요." ) ;
@@ -649,7 +663,6 @@ const TimelineSection = ({
649663 < div className = "overlay-backdrop" aria-hidden = "true" />
650664 < div ref = { notificationMenuRef } className = "notification-popover panel" role = "dialog" aria-modal = "true" aria-label = "알림" >
651665 < div className = "notification-popover-body" ref = { notificationScrollRef } >
652- { notificationsError ? < p className = "error" > { notificationsError } </ p > : null }
653666 { notificationItems . length === 0 && ! notificationsLoading ? (
654667 < p className = "empty" > 표시할 알림이 없습니다.</ p >
655668 ) : null }
@@ -785,7 +798,6 @@ const TimelineSection = ({
785798 </ div >
786799 < div className = "timeline-column-body" ref = { scrollRef } >
787800 { ! account ? < p className = "empty" > 계정을 선택하면 타임라인을 불러옵니다.</ p > : null }
788- { account && timeline . error ? < p className = "error" > { timeline . error } </ p > : null }
789801 { account && timeline . items . length === 0 && ! timeline . loading ? (
790802 < p className = "empty" > { emptyMessage } </ p >
791803 ) : null }
@@ -836,10 +848,14 @@ const TimelineSection = ({
836848 ) ;
837849} ;
838850
839- type ThemeMode = "default" | "christmas" | "sky-pink" | "monochrome" ;
851+ type ThemeMode = "default" | "christmas" | "sky-pink" | "monochrome" | "matcha-core" ;
840852
841853const isThemeMode = ( value : string ) : value is ThemeMode =>
842- value === "default" || value === "christmas" || value === "sky-pink" || value === "monochrome" ;
854+ value === "default" ||
855+ value === "christmas" ||
856+ value === "sky-pink" ||
857+ value === "monochrome" ||
858+ value === "matcha-core" ;
843859
844860const getStoredTheme = ( ) : ThemeMode => {
845861 const storedTheme = localStorage . getItem ( "textodon.theme" ) ;
@@ -888,6 +904,7 @@ export const App = () => {
888904 const [ mobileMenuOpen , setMobileMenuOpen ] = useState ( false ) ;
889905 const [ mobileComposeOpen , setMobileComposeOpen ] = useState ( false ) ;
890906 const { services, accountsState } = useAppContext ( ) ;
907+ const { showToast } = useToast ( ) ;
891908 const [ sections , setSections ] = useState < TimelineSectionConfig [ ] > ( ( ) => {
892909 try {
893910 const raw = localStorage . getItem ( SECTION_STORAGE_KEY ) ;
@@ -956,6 +973,14 @@ export const App = () => {
956973 const previousAccountIds = useRef < Set < string > > ( new Set ( ) ) ;
957974 const hasAccounts = accountsState . accounts . length > 0 ;
958975
976+ useEffect ( ( ) => {
977+ if ( ! actionError ) {
978+ return ;
979+ }
980+ showToast ( actionError , { tone : "error" } ) ;
981+ setActionError ( null ) ;
982+ } , [ actionError , showToast ] ) ;
983+
959984 const registerTimelineListener = useCallback ( ( accountId : string , listener : ( status : Status ) => void ) => {
960985 const next = new Map ( timelineListeners . current ) ;
961986 const existing = next . get ( accountId ) ?? new Set ( ) ;
@@ -1669,7 +1694,6 @@ export const App = () => {
16691694 { hasAccounts ? (
16701695 < section className = "main-column" >
16711696 { oauthLoading ? < p className = "empty" > OAuth 인증 중...</ p > : null }
1672- { actionError ? < p className = "error" > { actionError } </ p > : null }
16731697 { route === "home" ? (
16741698 < section className = "panel" >
16751699 { sections . length > 0 ? (
@@ -1881,6 +1905,7 @@ onAccountChange={setSectionAccount}
18811905 < option value = "christmas" > 크리스마스</ option >
18821906 < option value = "sky-pink" > 하늘핑크</ option >
18831907 < option value = "monochrome" > 모노톤</ option >
1908+ < option value = "matcha-core" > 말차코어</ option >
18841909 </ select >
18851910 </ div >
18861911 < div className = "settings-item" >
0 commit comments