Skip to content

Commit

Permalink
fix typing for error and fallback to default if getter fails
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuaboud committed Jun 7, 2024
1 parent b555d97 commit f16fc72
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions houston-common-ui/lib/composables/computedResult.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { reportError } from "@/components/NotificationView.vue";
import { ResultAsync, Result } from "neverthrow";
import { ResultAsync, Result, ok, okAsync } from "neverthrow";
import { watchEffect, ref, type Ref } from "vue";

/**
Expand All @@ -19,10 +19,10 @@ import { watchEffect, ref, type Ref } from "vue";
* // dirContents.value is undefined until listDirectory() finishes
*/
export function computedResult<T>(
getter: () => Result<T, any>
getter: () => Result<T, Error>
): [reference: Ref<T | undefined>, triggerUpdate: typeof getter];
export function computedResult<T>(
getter: () => ResultAsync<T, any>
getter: () => ResultAsync<T, Error>
): [reference: Ref<T | undefined>, triggerUpdate: typeof getter];
/**
* Create a computed ref with default value that grabs it's value from a {@link Result} or {@link ResultAsync},
Expand All @@ -42,20 +42,28 @@ export function computedResult<T>(
* // dirContents.value defaults to [] until listDirectory() finishes
*/
export function computedResult<T>(
getter: () => Result<T, any>,
getter: () => Result<T, Error>,
defaultValue: T
): [reference: Ref<T>, triggerUpdate: typeof getter];
export function computedResult<T>(
getter: () => ResultAsync<T, any>,
getter: () => ResultAsync<T, Error>,
defaultValue: T
): [reference: Ref<T>, triggerUpdate: typeof getter];
export function computedResult<T>(
getter: (() => Result<T, any>) | (() => ResultAsync<T, any>),
getter: (() => Result<T, Error>) | (() => ResultAsync<T, Error>),
defaultValue?: T
): [reference: Ref<T | undefined>, triggerUpdate: typeof getter] {
const reference = ref<T>();
reference.value = defaultValue;
const triggerUpdate = () => getter().map((v) => (reference.value = v));
const triggerUpdate = () =>
getter()
.mapErr((e) => {
reference.value = defaultValue;
return e;
})
.map((v) => {
return (reference.value = v);
});
watchEffect(() => triggerUpdate().mapErr(reportError));
return [reference, triggerUpdate as typeof getter];
}

0 comments on commit f16fc72

Please sign in to comment.