Appearance
Data
With your Subjects defined, writing and reading data can be done by writing and subscribing to the AD4M perspective.
This logic has been bundled into two hooks: useSubject
and useSubjects
, for working with a single item and lists of items respectively.
A Flux Plugin will always recieve two things.
perspective
which is aPerspectiveProxy
.channelSource
which is theid
of the channel your plugin is installed in.agent
which is aAgentClient
, that allows you to interact with the Agent/User.
Getting a list of items
Now, let's get a list of Todo's, which is also part of the boilerplate. This assumes we've created a Subject Class called Todo
with a given set of fields.
jsx
import { useSubject, useSubjects } from "@fluxapp/react";
import { Community } from "@coasys/flux-api";
import Todo from "../subjects/Todo";
export default function TodoView({ perspective, channelSource })
const { entry: community } = useSubject({
perspective,
subject: Community,
});
const { entries: todos, repo } = useSubjects({
perspective,
source: channelSource,
subject: Todo,
});
return (
<h1>{community?.name}</h1>
<ul>
{todos?.map(todo => <li>{todo.name}</li>)}
</ul>
)
};
Getting a single item
If we want to fetch a single entry based on it's id. We can use the useSubject
hook and just pass in an id.
tsx
import { useSubject } from "@fluxapp/react";
import { Todo } from "@coasys/flux-api";
export default function Todo({ perspective, id }) {
const { entry: todo } = useSubject({
perspective,
id:
subject: Todo,
});
return (
<h1>{todo?.title}</h1>
)
};
Creating data
To create data, all we need to do is use repo.create()
on the repo we want to add the data to. Let's create a new Todo item.
TIP
Since we're subscribed to all changes, the list of Todos will automatically update when we create a new item!
jsx
import { useSubject, useSubjects } from "@fluxapp/react";
import { Community } from "@coasys/flux-api";
import Todo from "../subjects/Todo";
export default function TodoView({ perspective, channelSource }) {
const [title, setTitle] = useState("");
const { entry: community } = useSubject({
perspective,
subject: Community,
});
const { entries: todos, repo } = useSubjects({
perspective,
source: channelSource,
subject: Todo,
});
function createTodo(e) {
if (e.key !== "Enter") return;
repo.create({ title: title })
}
return (
<h1>{community?.name}</h1>
<input
placeholder="Name of Todo"
onKeyDown={createTodo}
onChange={(e) => setTitle(e.target.value)}
/>
<ul>
{todos?.map(todo => <li>{todo.name}</li>)}
</ul>
)
};
Updating data
Next, let's add functionality to toggle a Todo's state using the repo.update()
function.
In this example we use the j-checkbox web-component from Flux UI:
jsx
import { useSubject, useSubjects } from "@fluxapp/react";
import { Community } from "@coasys/flux-api";
import Todo from "../subjects/Todo";
export default function TodoView({ perspective, channelSource }) {
const [title, setTitle] = useState("");
const { entry: community } = useSubject({
perspective,
subject: Community,
});
const { entries: todos, repo } = useSubjects({
perspective,
source: channelSource,
subject: Todo,
});
function createTodo(e) {
if (e.key !== "Enter") return;
repo.create({ title: title })
}
function toggleTodo({ id, done }) {
repo.update(id, { done });
}
return (
<h1>{community?.name}</h1>
<input
placeholder="Name of Todo"
onKeyDown={createTodo}
onChange={(e) => setTitle(e.target.value)}
/>
<ul>
{todos?.map(todo => (
<li>
<j-checkbox
onChange={(e) =>
toggleTodo({ id: todo.id, done: e.target.checked })
}
checked={todo.done}
>
{todo.name}
</j-checkbox>
</li>
)}
</ul>
)
};
Deleting data
Deleting data, as you might guess, is done with repo.remove()
. Let's add a button for deleting Todo-items:
jsx
import { useSubject, useSubjects } from "@fluxapp/react";
import { Community } from "@coasys/flux-api";
import Todo from "../subjects/Todo";
export default function TodoView({ perspective, channelSource }) {
const [title, setTitle] = useState("");
const { entry: community } = useSubject({
perspective,
subject: Community,
});
const { entries: todos, repo } = useSubjects({
perspective,
source: channelSource,
subject: Todo,
});
function createTodo(e) {
if (e.key !== "Enter") return;
repo.create({ title: title })
}
function toggleTodo({ id, done }) {
repo.update(id, { done });
}
function deleteTodo(id: string) {
repo.remove(id);
}
return (
<h1>{community?.name}</h1>
<input
placeholder="Name of Todo"
onKeyDown={createTodo}
onChange={(e) => setTitle(e.target.value)}
/>
<ul>
{todos?.map(todo => (
<li>
<j-checkbox
onChange={(e) =>
toggleTodo({ id: todo.id, done: e.target.checked })
}
checked={todo.done}
>
{todo.name}
</j-checkbox>
<j-button onClick={() => deleteTodo(todo.id)}>Delete</j-button>
</li>
)}
</ul>
)
};