import {
Container,
BrushyDIProvider,
createToken,
useInject,
useInjectLazy,
} from "@brushy/di";
import { useState, useEffect } from "react";
// Tokens
const USER_SERVICE = createToken<UserService>("USER_SERVICE");
const ANALYTICS_SERVICE = createToken<AnalyticsService>("ANALYTICS_SERVICE");
// Services
class UserService {
async getUsers() {
return fetch("/api/users").then((r) => r.json());
}
}
class AnalyticsService {
trackEvent(name, data) {
console.log(`Event: ${name}`, data);
}
}
// Container
const container = new Container();
container.register(USER_SERVICE, { useClass: UserService });
container.register(ANALYTICS_SERVICE, { useClass: AnalyticsService });
// Component
function UserList() {
const userService = useInject(USER_SERVICE);
const analyticsService = useInjectLazy(ANALYTICS_SERVICE);
const [users, setUsers] = useState([]);
useEffect(() => {
userService.getUsers().then(setUsers);
}, [userService]);
const trackClick = () => {
analyticsService.trackEvent("user_list_clicked", { count: users.length });
};
return (
<div onClick={trackClick}>
<h1>Users</h1>
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
</div>
);
}
// App
export default function App() {
return (
<BrushyDIProvider container={container}>
<UserList />
</BrushyDIProvider>
);
}