1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect } from "https://esm.sh/react@18.2.0";
3import { Contact, Interaction, InteractionType } from "../../shared/types.ts";
4import InteractionForm from "./InteractionForm.tsx";
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState } from "https://esm.sh/react@18.2.0";
3import { Contact } from "../../shared/types.ts";
4
20 const [errors, setErrors] = useState<Record<string, string>>({});
21
22 const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
23 const { name, value } = e.target;
24 setFormData(prev => ({ ...prev, [name]: value }));
49 };
50
51 const handleSubmit = (e: React.FormEvent) => {
52 e.preventDefault();
53
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React from "https://esm.sh/react@18.2.0";
3import { Contact } from "../../shared/types.ts";
4
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect } from "https://esm.sh/react@18.2.0";
3import { Contact } from "../../shared/types.ts";
4import ContactList from "./ContactList.tsx";
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React from "https://esm.sh/react@18.2.0";
3import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
4import App from "./components/App.tsx";
5
43
44- Backend: Hono, SQLite
45- Frontend: React, Tailwind CSS
46- Shared: TypeScript
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { useState } from "https://esm.sh/react@18.2.0";
3
4export default function GitHubPRAnalyzer() {
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState } from "https://esm.sh/react@18.2.0";
3import { User } from "../../shared/types.ts";
4
7}
8
9const LoginForm: React.FC<LoginFormProps> = ({ onLoginSuccess }) => {
10 const [email, setEmail] = useState("");
11 const [name, setName] = useState("");
13 const [error, setError] = useState<string | null>(null);
14
15 const handleSubmit = async (e: React.FormEvent) => {
16 e.preventDefault();
17
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState } from "https://esm.sh/react@18.2.0";
3import { User } from "../../shared/types.ts";
4
8}
9
10const Header: React.FC<HeaderProps> = ({ user, onLogout }) => {
11 const [menuOpen, setMenuOpen] = useState(false);
12
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect } from "https://esm.sh/react@18.2.0";
3import Header from "./Header.tsx";
4import LoginForm from "./LoginForm.tsx";
17}
18
19const App: React.FC = () => {
20 const [user, setUser] = useState<User | null>(null);
21 const [token, setToken] = useState<string | null>(null);