Unified · Split
| @@ -1,11 +1,11 @@ | |||
| 1 | import { EDITORS, EditorId, type EnvironmentId } from "@t3tools/contracts"; | 1 | import { EDITORS, EditorId, EnvironmentId } from "@t3tools/contracts"; |
| 2 | import { | 2 | import { |
| 3 | mapAtomCommandResult, | 3 | mapAtomCommandResult, |
| 4 | type AtomCommandFailure, | 4 | type AtomCommandFailure, |
| 5 | type AtomCommandResult, | 5 | type AtomCommandResult, |
| 6 | } from "@t3tools/client-runtime/state/runtime"; | 6 | } from "@t3tools/client-runtime/state/runtime"; |
| 7 | import * as Cause from "effect/Cause"; | 7 | import * as Cause from "effect/Cause"; |
| 8 | import * as Data from "effect/Data"; | 8 | import * as Schema from "effect/Schema"; |
| 9 | import { AsyncResult } from "effect/unstable/reactivity"; | 9 | import { AsyncResult } from "effect/unstable/reactivity"; |
| 10 | import { getLocalStorageItem, setLocalStorageItem, useLocalStorage } from "./hooks/useLocalStorage"; | 10 | import { getLocalStorageItem, setLocalStorageItem, useLocalStorage } from "./hooks/useLocalStorage"; |
| 11 | import { useCallback, useMemo } from "react"; | 11 | import { useCallback, useMemo } from "react"; |
| @@ -14,11 +14,29 @@ import { useAtomCommand } from "./state/use-atom-command"; · 2 unmodified lines | |||
| 14 | 14 | ||
| 15 | const LAST_EDITOR_KEY = "t3code:last-editor"; | 15 | const LAST_EDITOR_KEY = "t3code:last-editor"; |
| 16 | 16 | ||
| 17 | export class PreferredEditorUnavailableError extends Data.TaggedError( | 17 | export class PreferredEditorEnvironmentRequiredError extends Schema.TaggedErrorClass<PreferredEditorEnvironmentRequiredError>()( |
| 18 | "PreferredEditorEnvironmentRequiredError", | ||
| 19 | { | ||
| 20 | targetPath: Schema.String, | ||
| 21 | }, | ||
| 22 | ) { | ||
| 23 | override get message(): string { | ||
| 24 | return `Cannot open ${this.targetPath} because no environment is selected.`; | ||
| 25 | } | ||
| 26 | } | ||
| 27 | |||
| 28 | export class PreferredEditorUnavailableError extends Schema.TaggedErrorClass<PreferredEditorUnavailableError>()( | ||
| 18 | "PreferredEditorUnavailableError", | 29 | "PreferredEditorUnavailableError", |
| 19 | )<{ | 30 | { |
| 20 | readonly message: string; | 31 | environmentId: EnvironmentId, |
| 21 | }> {} | 32 | targetPath: Schema.String, |
| 33 | availableEditorIds: Schema.Array(EditorId), | ||
| 34 | }, | ||
| 35 | ) { | ||
| 36 | override get message(): string { | ||
| 37 | return `No available editor can open ${this.targetPath} in environment ${this.environmentId}.`; | ||
| 38 | } | ||
| 39 | } | ||
| 22 | 40 | ||
| 23 | export function usePreferredEditor(availableEditors: ReadonlyArray<EditorId>) { | 41 | export function usePreferredEditor(availableEditors: ReadonlyArray<EditorId>) { |
| 24 | const [lastEditor, setLastEditor] = useLocalStorage(LAST_EDITOR_KEY, null, EditorId); | 42 | const [lastEditor, setLastEditor] = useLocalStorage(LAST_EDITOR_KEY, null, EditorId); |
| @@ -55,13 +73,18 @@ export function useOpenInPreferredEditor( · 30 unmodified lines | |||
| 55 | async ( | 73 | async ( |
| 56 | targetPath: string, | 74 | targetPath: string, |
| 57 | ): Promise< | 75 | ): Promise< |
| 58 | AtomCommandResult<EditorId, OpenInEditorError | PreferredEditorUnavailableError> | 76 | AtomCommandResult< |
| 77 | EditorId, | ||
| 78 | | OpenInEditorError | ||
| 79 | | PreferredEditorEnvironmentRequiredError | ||
| 80 | | PreferredEditorUnavailableError | ||
| 81 | > | ||
| 59 | > => { | 82 | > => { |
| 60 | if (environmentId === null) { | 83 | if (environmentId === null) { |
| 61 | return AsyncResult.failure( | 84 | return AsyncResult.failure( |
| 62 | Cause.fail( | 85 | Cause.fail( |
| 63 | new PreferredEditorUnavailableError({ | 86 | new PreferredEditorEnvironmentRequiredError({ |
| 64 | message: "No environment is selected.", | 87 | targetPath, |
| 65 | }), | 88 | }), |
| 66 | ), | 89 | ), |
| 67 | ); | 90 | ); |
| @@ -71,7 +94,9 @@ export function useOpenInPreferredEditor( · 3 unmodified lines | |||
| 71 | return AsyncResult.failure( | 94 | return AsyncResult.failure( |
| 72 | Cause.fail( | 95 | Cause.fail( |
| 73 | new PreferredEditorUnavailableError({ | 96 | new PreferredEditorUnavailableError({ |
| 74 | message: "No available editors found.", | 97 | environmentId, |
| 98 | targetPath, | ||
| 99 | availableEditorIds: availableEditors, | ||
| 75 | }), | 100 | }), |
| 76 | ), | 101 | ), |
| 77 | ); | 102 | ); |