diff --git a/every-jap-dict/App.tsx b/every-jap-dict/App.tsx index 1a4e3ca..f5c4493 100755 --- a/every-jap-dict/App.tsx +++ b/every-jap-dict/App.tsx @@ -1,50 +1,186 @@ import { StatusBar } from 'expo-status-bar'; -import { SafeAreaView, StyleSheet, View } from 'react-native'; +import { FlatList, Modal, Pressable, StyleSheet, View } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { GluestackUIProvider } from '@/components/ui/gluestack-ui-provider'; import '@/global.css'; import { useWordbook, WordbookProvider } from './lib/wordbook/context'; import { Text } from './components/ui/text'; import { useMemo, useState } from 'react'; -import { languages } from './lib/providers/dictionaries'; +import { jaPack, languages } from './lib/providers/dictionaries'; +import { Input, InputField } from './components/ui/input'; +import { HStack } from './components/ui/hstack'; +import { Button, ButtonText } from './components/ui/button'; +import DictWebView from './components/DictWebView'; +import AdBannerPlaceholder from './components/AdBannerPlaceholder'; function MainScreen() { const [q, setQ] = useState(''); - const [langIdx, setLangIdx] = useState(0); + const [query, setQuery] = useState(''); const [activeId, setActiveId] = useState(''); const [wordbookOpen, setWordbookOpen] = useState(false); - const pack = languages[langIdx]; + const pack = jaPack; const providers = pack.providers; const canSearch = q.trim().length > 0; + const hasQuery = query.trim().length > 0; const { add, items, remove, clear, loading } = useWordbook(); const urls = useMemo( () => providers.reduce>((acc, p) => { - acc[p.id] = canSearch ? p.buildUrl(q.trim()) : ''; + acc[p.id] = hasQuery ? p.buildUrl(query.trim()) : ''; return acc; }, {}), - [providers, q, canSearch], + [providers, query, hasQuery], ); + const onSearch = () => { + if (!canSearch) return; + setQuery(q.trim()); + setActiveId(providers[0]?.id ?? ''); + }; + + const onSave = () => { + if (!canSearch) return; + add(q.trim(), pack.code); + }; + + const onPickWord = (word: string) => { + const t = word.trim(); + setWordbookOpen(false); + setQ(t); + setQuery(t); + setActiveId(providers[0]?.id ?? ''); + }; + return ( - + + {/* 상단 검색창, 버튼 */} - Hello + {/* 액션 버튼 */} + + + + + + {/* 검색창 */} + + + + + + + + + {/* 커스텀 탭 헤더 */} + + + {providers.map((p) => { + const selected = activeId ? activeId === p.id : false; + return ( + + ); + })} + - + + {/* 패널: WebView 모두 마운트 후 토글 */} + + {!canSearch ? ( + + 검색어를 입력하고 [검색]을 눌러주세요 + + ) : activeId ? ( + + ) : ( + + 사전을 선택하세요 + + )} + + + + + setWordbookOpen(false)} + > + + + 단어장 + + + + + + + {loading ? ( + + 불러오는 중... + + ) : ( + x.id} + renderItem={({ item }) => ( + + onPickWord(item.text)} + style={{ flex: 1 }} + className="justify-center items-center" + > + {item.text} + + + + )} + /> + )} + + + ); } export default function App() { return ( - - - - + + + + + + ); }