export function useFetchSite(args: { id: number }) {
const [initializing, setInitializing] = useState(true);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string>();
const [data, setData] = useState<SiteDetails>();
const fetchData = useCallback((id: number) => {
return Effect.gen(function* ($) {
const service = yield* $(SiteService);
yield* $(
Effect.all([
Effect.sync(() => setInitializing(true)),
Effect.sync(() => setLoading(true)),
Effect.sync(() => setError(undefined)),
]),
);
yield* $(
service.getById({ id }),
Effect.tapBoth({
onSuccess: (data) =>
Effect.all([
Effect.sync(() => setData(data)),
Effect.sync(() => setInitializing(false)),
Effect.sync(() => setLoading(false)),
Effect.sync(() => setError(undefined)),
]),
onFailure: (err) =>
Effect.all([
Effect.sync(() => setData(undefined)),
Effect.sync(() => setInitializing(false)),
Effect.sync(() => setLoading(false)),
Effect.sync(() => setError(err.message)),
]),
}),
);
}).pipe(AppRuntime.runPromise);
}, []);
const retry = useCallback(() => setInitializing(true), []);
useEffect(() => {
if (initializing) {
fetchData(args.id);
}
}, [args.id, fetchData, initializing]);
return { loading, error, data, retry };
}
export function useFetchSite(args: { id: number }) {
const [initializing, setInitializing] = useState(true);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string>();
const [data, setData] = useState<SiteDetails>();
const fetchData = useCallback((id: number) => {
return Effect.gen(function* ($) {
const service = yield* $(SiteService);
yield* $(
Effect.all([
Effect.sync(() => setInitializing(true)),
Effect.sync(() => setLoading(true)),
Effect.sync(() => setError(undefined)),
]),
);
yield* $(
service.getById({ id }),
Effect.tapBoth({
onSuccess: (data) =>
Effect.all([
Effect.sync(() => setData(data)),
Effect.sync(() => setInitializing(false)),
Effect.sync(() => setLoading(false)),
Effect.sync(() => setError(undefined)),
]),
onFailure: (err) =>
Effect.all([
Effect.sync(() => setData(undefined)),
Effect.sync(() => setInitializing(false)),
Effect.sync(() => setLoading(false)),
Effect.sync(() => setError(err.message)),
]),
}),
);
}).pipe(AppRuntime.runPromise);
}, []);
const retry = useCallback(() => setInitializing(true), []);
useEffect(() => {
if (initializing) {
fetchData(args.id);
}
}, [args.id, fetchData, initializing]);
return { loading, error, data, retry };
}