@tutti-os/workspace-user-project 0.0.36 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-JKSIGLCI.js → chunk-4VTT6WSG.js} +4 -3
- package/dist/chunk-4VTT6WSG.js.map +1 -0
- package/dist/core/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +10 -8
- package/dist/ui/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-JKSIGLCI.js.map +0 -1
|
@@ -56,8 +56,9 @@ async function prepareWorkspaceUserProjectSelection(api, input) {
|
|
|
56
56
|
const response = await api.list();
|
|
57
57
|
const projects = response.projects;
|
|
58
58
|
const selectedPath = input.selectedPath?.trim() ?? "";
|
|
59
|
-
const
|
|
60
|
-
|
|
59
|
+
const isSelectedPathNoProject = selectedPath && api.isNoProjectPath?.({ path: selectedPath }) === true;
|
|
60
|
+
const isSelectedPathMissing = input.projectLocked && selectedPath && !isSelectedPathNoProject ? await checkWorkspaceUserProjectPathMissing(api, selectedPath) : false;
|
|
61
|
+
if (!input.projectLocked && selectedPath && !isSelectedPathNoProject && !projects.some((project) => project.path === selectedPath)) {
|
|
61
62
|
await api.rememberDefaultSelection?.({ path: null });
|
|
62
63
|
return {
|
|
63
64
|
isSelectedPathMissing,
|
|
@@ -120,4 +121,4 @@ export {
|
|
|
120
121
|
prepareWorkspaceUserProjectSelection,
|
|
121
122
|
checkWorkspaceUserProjectPathMissing
|
|
122
123
|
};
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
124
|
+
//# sourceMappingURL=chunk-4VTT6WSG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectCreationErrorCode,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput\n} from \"../contracts/index.ts\";\n\nexport function upsertWorkspaceUserProject(\n projects: readonly WorkspaceUserProject[],\n project: WorkspaceUserProject\n): WorkspaceUserProject[] {\n const existingIndex = projects.findIndex(\n (item) => item.id === project.id || item.path === project.path\n );\n if (existingIndex < 0) {\n return [project, ...projects];\n }\n const next = [...projects];\n next[existingIndex] = project;\n return next;\n}\n\nexport function resolveWorkspaceUserProjectDisplayLabel(\n project: Pick<WorkspaceUserProject, \"id\" | \"label\" | \"path\">\n): string {\n const label = stripAbsolutePathFromWorkspaceUserProjectLabel(project.label);\n if (label) {\n return label;\n }\n return basenameWorkspaceUserProjectPath(project.path) || project.id;\n}\n\nexport function stripAbsolutePathFromWorkspaceUserProjectLabel(\n label: string\n): string {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) {\n return \"\";\n }\n const pathStart = findAbsolutePathStart(trimmedLabel);\n if (pathStart < 0) {\n return trimmedLabel;\n }\n if (pathStart === 0) {\n return basenameWorkspaceUserProjectPath(trimmedLabel);\n }\n return trimmedLabel\n .slice(0, pathStart)\n .replace(/[\\s/\\\\|:()[\\]{}-]+$/u, \"\")\n .trim();\n}\n\nexport function basenameWorkspaceUserProjectPath(path: string): string {\n const normalizedPath = path.trim().replace(/[\\\\/]+$/u, \"\");\n if (!normalizedPath) {\n return \"\";\n }\n const segments = normalizedPath.split(/[\\\\/]+/u);\n return segments[segments.length - 1] ?? \"\";\n}\n\nexport function getWorkspaceUserProjectErrorCode(\n error: unknown\n): WorkspaceUserProjectCreationErrorCode | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\") {\n return code;\n }\n\n return getWorkspaceUserProjectErrorCode((error as { cause?: unknown }).cause);\n}\n\nexport async function prepareWorkspaceUserProjectSelection(\n api: WorkspaceUserProjectApi,\n input: WorkspaceUserProjectSelectionPreparationInput\n): Promise<WorkspaceUserProjectSelectionPreparation> {\n if (api.prepareSelection) {\n return api.prepareSelection(input);\n }\n const response = await api.list();\n const projects = response.projects;\n const selectedPath = input.selectedPath?.trim() ?? \"\";\n const isSelectedPathNoProject =\n selectedPath && api.isNoProjectPath?.({ path: selectedPath }) === true;\n const isSelectedPathMissing =\n input.projectLocked && selectedPath && !isSelectedPathNoProject\n ? await checkWorkspaceUserProjectPathMissing(api, selectedPath)\n : false;\n\n if (\n !input.projectLocked &&\n selectedPath &&\n !isSelectedPathNoProject &&\n !projects.some((project) => project.path === selectedPath)\n ) {\n await api.rememberDefaultSelection?.({ path: null });\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"clear\",\n suppressedPath: selectedPath\n }\n };\n }\n\n if (input.projectLocked || selectedPath) {\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n }\n\n const defaultSelection = await api.getDefaultSelection?.();\n const defaultPath = defaultSelection?.path?.trim() ?? \"\";\n if (defaultPath && projects.some((project) => project.path === defaultPath)) {\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"select\",\n path: defaultPath\n }\n };\n }\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n}\n\nexport async function checkWorkspaceUserProjectPathMissing(\n api: Pick<WorkspaceUserProjectApi, \"checkPath\">,\n path: string\n): Promise<boolean> {\n try {\n const result = await api.checkPath?.({ path });\n return result ? !result.exists || !result.isDirectory : false;\n } catch {\n return false;\n }\n}\n\nfunction findAbsolutePathStart(value: string): number {\n const indexes = [\n value.search(/\\/[^\\s/]/u),\n value.search(/[A-Za-z]:[\\\\/]/u),\n value.search(/\\\\\\\\[^\\s\\\\]/u),\n value.search(/~[\\\\/]/u)\n ].filter((index) => index >= 0);\n return indexes.length > 0 ? Math.min(...indexes) : -1;\n}\n"],"mappings":"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","names":[]}
|
package/dist/core/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
resolveWorkspaceUserProjectDisplayLabel,
|
|
7
7
|
stripAbsolutePathFromWorkspaceUserProjectLabel,
|
|
8
8
|
upsertWorkspaceUserProject
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-4VTT6WSG.js";
|
|
10
10
|
export {
|
|
11
11
|
basenameWorkspaceUserProjectPath,
|
|
12
12
|
checkWorkspaceUserProjectPathMissing,
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
resolveWorkspaceUserProjectDisplayLabel,
|
|
7
7
|
stripAbsolutePathFromWorkspaceUserProjectLabel,
|
|
8
8
|
upsertWorkspaceUserProject
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-4VTT6WSG.js";
|
|
10
10
|
import {
|
|
11
11
|
createDefaultWorkspaceUserProjectI18nRuntime,
|
|
12
12
|
createWorkspaceUserProjectI18nRuntime,
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { WorkspaceUserProjectApi, WorkspaceUserProjectService } from '../contracts/index.js';
|
|
2
|
+
import { WorkspaceUserProjectApi, WorkspaceUserProject, WorkspaceUserProjectService } from '../contracts/index.js';
|
|
3
3
|
import { WorkspaceUserProjectI18nRuntime } from '../i18n/index.js';
|
|
4
4
|
import '@tutti-os/ui-i18n-runtime';
|
|
5
5
|
|
|
@@ -43,6 +43,7 @@ interface WorkspaceUserProjectSelectProps {
|
|
|
43
43
|
onProjectMissingChange?: (isMissing: boolean) => void;
|
|
44
44
|
onProjectPathChange: (path: string | null, metadata?: {
|
|
45
45
|
action: WorkspaceUserProjectSelectChangeAction;
|
|
46
|
+
project?: WorkspaceUserProject;
|
|
46
47
|
}) => void;
|
|
47
48
|
projectLocked?: boolean;
|
|
48
49
|
renderAddProjectIcon?: () => ReactNode;
|
package/dist/ui/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
prepareWorkspaceUserProjectSelection,
|
|
5
5
|
resolveWorkspaceUserProjectDisplayLabel,
|
|
6
6
|
upsertWorkspaceUserProject
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-4VTT6WSG.js";
|
|
8
8
|
import {
|
|
9
9
|
createDefaultWorkspaceUserProjectI18nRuntime
|
|
10
10
|
} from "../chunk-LSYV5EMT.js";
|
|
@@ -156,6 +156,8 @@ function WorkspaceUserProjectSelect({
|
|
|
156
156
|
() => resolveWorkspaceUserProjectSelectLabels(i18n, labels),
|
|
157
157
|
[i18n, labels]
|
|
158
158
|
);
|
|
159
|
+
const createProjectNameDescription = resolvedLabels.createProjectNameLabel.trim();
|
|
160
|
+
const createProjectNameInputLabel = createProjectNameDescription || resolvedLabels.createProjectNamePlaceholder.trim();
|
|
159
161
|
const [apiProjects, setApiProjects] = useState([]);
|
|
160
162
|
const [isApiLoading, setIsApiLoading] = useState(false);
|
|
161
163
|
const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);
|
|
@@ -176,7 +178,7 @@ function WorkspaceUserProjectSelect({
|
|
|
176
178
|
const selectedPathLabel = basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;
|
|
177
179
|
const selectedProject = showKnownProjectOptions ? projects.find((project) => project.path === selectedPath) ?? null : null;
|
|
178
180
|
const selectedProjectLabel = selectedProject ? resolveWorkspaceUserProjectDisplayLabel(selectedProject) : "";
|
|
179
|
-
const isSelectedNoProjectPath =
|
|
181
|
+
const isSelectedNoProjectPath = Boolean(selectedPath) && Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));
|
|
180
182
|
const shouldShowMissingProjectNotice = isSelectedPathMissing;
|
|
181
183
|
const shouldShowLockedProjectPath = projectLocked && selectedPath !== "" && !isSelectedNoProjectPath && !selectedProject && !isSelectedPathMissing;
|
|
182
184
|
const selectValue = selectedProject ? selectedProject.path : noProjectOptionValue;
|
|
@@ -299,7 +301,7 @@ function WorkspaceUserProjectSelect({
|
|
|
299
301
|
(current) => upsertWorkspaceUserProject(current, project)
|
|
300
302
|
);
|
|
301
303
|
setHasPinnedNoProjectSelection(false);
|
|
302
|
-
onProjectPathChange(project.path, { action });
|
|
304
|
+
onProjectPathChange(project.path, { action, project });
|
|
303
305
|
refreshPreparedSelection();
|
|
304
306
|
} catch {
|
|
305
307
|
setApiUnavailableUnlessService(setIsApiUnavailable, service);
|
|
@@ -324,7 +326,7 @@ function WorkspaceUserProjectSelect({
|
|
|
324
326
|
const project = await effectiveApi.create({ name });
|
|
325
327
|
setApiProjects((current) => upsertWorkspaceUserProject(current, project));
|
|
326
328
|
setHasPinnedNoProjectSelection(false);
|
|
327
|
-
onProjectPathChange(project.path, { action: "create_new" });
|
|
329
|
+
onProjectPathChange(project.path, { action: "create_new", project });
|
|
328
330
|
setDraftProjectName("");
|
|
329
331
|
setIsProjectDialogOpen(false);
|
|
330
332
|
refreshPreparedSelection();
|
|
@@ -530,10 +532,10 @@ function WorkspaceUserProjectSelect({
|
|
|
530
532
|
children: /* @__PURE__ */ jsxs("form", { className: "grid gap-4", onSubmit: submitProjectDialog, children: [
|
|
531
533
|
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
532
534
|
/* @__PURE__ */ jsx(DialogTitle, { children: resolvedLabels.createProjectTitle }),
|
|
533
|
-
/* @__PURE__ */ jsx(DialogDescription, { children:
|
|
535
|
+
createProjectNameDescription ? /* @__PURE__ */ jsx(DialogDescription, { children: createProjectNameDescription }) : null
|
|
534
536
|
] }),
|
|
535
537
|
/* @__PURE__ */ jsxs("label", { className: "grid gap-1.5", children: [
|
|
536
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children:
|
|
538
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: createProjectNameInputLabel }),
|
|
537
539
|
/* @__PURE__ */ jsx(
|
|
538
540
|
Input,
|
|
539
541
|
{
|
|
@@ -669,7 +671,7 @@ function createWorkspaceUserProjectApiAdapter(api, service) {
|
|
|
669
671
|
const apiUse = hasWorkspaceUserProjectMethod(api, "use") ? (input) => api.use(input) : void 0;
|
|
670
672
|
return {
|
|
671
673
|
checkPath: hasWorkspaceUserProjectMethod(service, "checkProjectPath") ? ({ path }) => service.checkProjectPath(path) : apiCheckPath,
|
|
672
|
-
create: hasWorkspaceUserProjectMethod(service, "createProject") ? ({ name }) => service.createProject(name) :
|
|
674
|
+
create: apiCreate ?? (hasWorkspaceUserProjectMethod(service, "createProject") ? ({ name }) => service.createProject(name) : void 0),
|
|
673
675
|
getDefaultSelection: hasWorkspaceUserProjectMethod(
|
|
674
676
|
service,
|
|
675
677
|
"getDefaultSelection"
|
|
@@ -684,7 +686,7 @@ function createWorkspaceUserProjectApiAdapter(api, service) {
|
|
|
684
686
|
service,
|
|
685
687
|
"rememberDefaultSelection"
|
|
686
688
|
) ? ({ path }) => service.rememberDefaultSelection({ path }) : apiRememberDefaultSelection,
|
|
687
|
-
selectDirectory: hasWorkspaceUserProjectMethod(service, "selectDirectory") ? () => service.selectDirectory() :
|
|
689
|
+
selectDirectory: apiSelectDirectory ?? (hasWorkspaceUserProjectMethod(service, "selectDirectory") ? () => service.selectDirectory() : void 0),
|
|
688
690
|
use: hasWorkspaceUserProjectMethod(service, "registerProjectPath") ? ({ path }) => service.registerProjectPath(path) : apiUse
|
|
689
691
|
};
|
|
690
692
|
}
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/internal/project/WorkspaceUserProjectSelect.tsx"],"sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FolderIcon,\n Input,\n LinkIcon,\n NewWorkspaceLinedIcon,\n NoWorkspaceLinedIcon,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectService\n} from \"../../../contracts/index.ts\";\nimport {\n basenameWorkspaceUserProjectPath,\n getWorkspaceUserProjectErrorCode,\n prepareWorkspaceUserProjectSelection,\n resolveWorkspaceUserProjectDisplayLabel,\n upsertWorkspaceUserProject\n} from \"../../../core/index.ts\";\nimport {\n createDefaultWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"../../../i18n/index.ts\";\n\nexport type WorkspaceUserProjectSelectLabels = {\n addProject: string;\n createProjectCancel: string;\n createProjectConfirm: string;\n createProjectDocumentsUnavailable: string;\n createProjectFailed: string;\n createProjectNameConflict: string;\n createProjectNameInvalid: string;\n createProjectNameLabel: string;\n createProjectNamePlaceholder: string;\n createProjectNameRequired: string;\n createProjectPermissionDenied: string;\n createProjectTitle: string;\n linkExistingProject: string;\n loadingProjects: string;\n noProject: string;\n projectLabel: string;\n projectLocked: string;\n projectMissingTitle: string;\n projectUnavailable: string;\n};\n\nexport type WorkspaceUserProjectSelectLabelOverrides =\n Partial<WorkspaceUserProjectSelectLabels>;\n\nexport interface WorkspaceUserProjectSelectClassNames {\n content?: string;\n item?: string;\n trigger?: string;\n}\n\nexport type WorkspaceUserProjectSelectChangeAction =\n | \"clear\"\n | \"create_new\"\n | \"select_existing\";\n\nexport interface WorkspaceUserProjectSelectProps {\n api?: WorkspaceUserProjectApi | null;\n classNames?: WorkspaceUserProjectSelectClassNames;\n contentAlign?: \"center\" | \"end\" | \"start\";\n contentSide?: \"bottom\" | \"left\" | \"right\" | \"top\";\n contentSideOffset?: number;\n disabled?: boolean;\n i18n?: WorkspaceUserProjectI18nRuntime;\n labels?: WorkspaceUserProjectSelectLabelOverrides;\n onProjectMissingChange?: (isMissing: boolean) => void;\n onProjectPathChange: (\n path: string | null,\n metadata?: { action: WorkspaceUserProjectSelectChangeAction }\n ) => void;\n projectLocked?: boolean;\n renderAddProjectIcon?: () => ReactNode;\n shouldApplyPreparedSelection?: boolean;\n showKnownProjectOptions?: boolean;\n service?: WorkspaceUserProjectService | null;\n selectedProjectPath?: string | null;\n showCreateProjectAction?: boolean;\n showNoProjectAction?: boolean;\n unlistedProjectLabel?: string;\n}\n\nconst noProjectOptionValue = \"__tutti_no_project__\";\nconst addProjectOptionValue = \"__tutti_add_project__\";\nconst linkExistingProjectOptionValue = \"__tutti_link_existing_project__\";\nconst workspaceUserProjectOverflowLabelStyle = `\n@keyframes workspace-user-project-label-marquee {\n 0% {\n transform: translateX(0);\n }\n\n 44%,\n 56% {\n transform: translateX(var(--workspace-user-project-label-marquee-distance, 0px));\n }\n\n 88%,\n 100% {\n transform: translateX(0);\n }\n}\n\n.workspace-user-project-overflow-label {\n --workspace-user-project-label-marquee-distance: 0px;\n container-type: normal;\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.workspace-user-project-trigger-label {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n gap: 0.5rem;\n min-width: 0;\n}\n\n.workspace-user-project-overflow-label__content {\n display: block;\n max-width: 100%;\n min-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n transform: translateX(0);\n white-space: nowrap;\n width: max-content;\n}\n\n.workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n[data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: workspace-user-project-label-marquee 14s linear infinite;\n max-width: none;\n overflow: visible;\n text-overflow: clip;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n [data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: none;\n }\n}\n`;\nconst defaultWorkspaceUserProjectSelectI18n =\n createDefaultWorkspaceUserProjectI18nRuntime();\nconst emptyWorkspaceUserProjectServiceSnapshot = proxy({\n error: null,\n initialized: false,\n isLoading: false,\n projects: [],\n revision: 0\n});\n\nexport function WorkspaceUserProjectSelect({\n api,\n classNames,\n contentAlign = \"start\",\n contentSide = \"top\",\n contentSideOffset = 4,\n disabled: disabledProp = false,\n i18n = defaultWorkspaceUserProjectSelectI18n,\n labels,\n onProjectMissingChange,\n onProjectPathChange,\n projectLocked = false,\n renderAddProjectIcon,\n shouldApplyPreparedSelection = true,\n showKnownProjectOptions = true,\n service,\n selectedProjectPath,\n showCreateProjectAction = hasWorkspaceUserProjectMethod(\n service,\n \"createProject\"\n ) || hasWorkspaceUserProjectMethod(api, \"create\"),\n showNoProjectAction = true,\n unlistedProjectLabel\n}: WorkspaceUserProjectSelectProps): React.JSX.Element {\n \"use memo\";\n const serviceSnapshot = useSnapshot(\n service?.store ?? emptyWorkspaceUserProjectServiceSnapshot\n );\n const effectiveApi = useMemo(\n () => createWorkspaceUserProjectApiAdapter(api, service),\n [api, service]\n );\n const resolvedLabels = useMemo(\n () => resolveWorkspaceUserProjectSelectLabels(i18n, labels),\n [i18n, labels]\n );\n const [apiProjects, setApiProjects] = useState<WorkspaceUserProject[]>([]);\n const [isApiLoading, setIsApiLoading] = useState(false);\n const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);\n const [isProjectDialogOpen, setIsProjectDialogOpen] = useState(false);\n const [isSelectOpen, setIsSelectOpen] = useState(false);\n const [draftProjectName, setDraftProjectName] = useState(\"\");\n const [projectCreationError, setProjectCreationError] = useState<\n string | null\n >(null);\n const [isCreatingProject, setIsCreatingProject] = useState(false);\n const [suppressedSelectedPath, setSuppressedSelectedPath] = useState<\n string | null\n >(null);\n const [hasPinnedNoProjectSelection, setHasPinnedNoProjectSelection] =\n useState(false);\n const [isSelectedPathMissing, setIsSelectedPathMissing] = useState(false);\n const rawSelectedPath = selectedProjectPath?.trim() ?? \"\";\n const selectedPath =\n rawSelectedPath && rawSelectedPath === suppressedSelectedPath\n ? \"\"\n : rawSelectedPath;\n const projects = service ? [...serviceSnapshot.projects] : apiProjects;\n const visibleProjects = showKnownProjectOptions ? projects : [];\n const isLoading = service\n ? serviceSnapshot.isLoading && !serviceSnapshot.initialized\n : isApiLoading;\n const isUnavailable = service\n ? Boolean(serviceSnapshot.error) && !serviceSnapshot.initialized\n : isApiUnavailable;\n const selectedPathLabel =\n basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;\n const selectedProject = showKnownProjectOptions\n ? (projects.find((project) => project.path === selectedPath) ?? null)\n : null;\n const selectedProjectLabel = selectedProject\n ? resolveWorkspaceUserProjectDisplayLabel(selectedProject)\n : \"\";\n const isSelectedNoProjectPath =\n projectLocked &&\n Boolean(selectedPath) &&\n Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));\n const shouldShowMissingProjectNotice = isSelectedPathMissing;\n const shouldShowLockedProjectPath =\n projectLocked &&\n selectedPath !== \"\" &&\n !isSelectedNoProjectPath &&\n !selectedProject &&\n !isSelectedPathMissing;\n const selectValue = selectedProject\n ? selectedProject.path\n : noProjectOptionValue;\n const triggerLabel = shouldShowMissingProjectNotice\n ? resolvedLabels.projectMissingTitle\n : isSelectedNoProjectPath\n ? resolvedLabels.noProject\n : shouldShowLockedProjectPath\n ? selectedPathLabel\n : selectedProject\n ? selectedProjectLabel\n : selectedPath\n ? unlistedProjectLabel || selectedPathLabel\n : isLoading\n ? resolvedLabels.loadingProjects\n : resolvedLabels.noProject;\n const shouldDisableWhileLoading =\n showKnownProjectOptions || shouldApplyPreparedSelection;\n const disabled =\n disabledProp ||\n projectLocked ||\n (shouldDisableWhileLoading && isLoading) ||\n !effectiveApi;\n const hasProjectActions =\n Boolean(effectiveApi?.selectDirectory) ||\n showCreateProjectAction ||\n showNoProjectAction;\n const showProjectActionDivider =\n visibleProjects.length > 0 && hasProjectActions;\n\n useEffect(() => {\n if (!disabled || !isSelectOpen) {\n return;\n }\n setIsSelectOpen(false);\n }, [disabled, isSelectOpen]);\n\n useEffect(() => {\n onProjectMissingChange?.(shouldShowMissingProjectNotice);\n }, [onProjectMissingChange, shouldShowMissingProjectNotice]);\n\n useEffect(() => {\n if (rawSelectedPath) {\n setHasPinnedNoProjectSelection(false);\n }\n if (\n suppressedSelectedPath &&\n (!rawSelectedPath || rawSelectedPath !== suppressedSelectedPath)\n ) {\n setSuppressedSelectedPath(null);\n }\n }, [rawSelectedPath, suppressedSelectedPath]);\n\n const applyPreparedSelection = useEffectEvent(\n (prepared: WorkspaceUserProjectSelectionPreparation): void => {\n if (!service) {\n setApiProjects(prepared.projects);\n }\n setIsSelectedPathMissing(prepared.isSelectedPathMissing);\n if (!shouldApplyPreparedSelection) {\n return;\n }\n if (prepared.selection.kind === \"clear\") {\n setHasPinnedNoProjectSelection(true);\n setSuppressedSelectedPath(prepared.selection.suppressedPath);\n onProjectPathChange(null);\n return;\n }\n if (prepared.selection.kind === \"select\") {\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(prepared.selection.path);\n }\n }\n );\n\n useEffect(() => {\n let canceled = false;\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (hasPinnedNoProjectSelection) {\n return;\n }\n setIsApiLoading(true);\n setApiUnavailableUnlessService(setIsApiUnavailable, service, false);\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input)\n .then((prepared) => {\n if (!canceled) {\n applyPreparedSelection(prepared);\n }\n })\n .catch(() => {\n if (!canceled) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n })\n .finally(() => {\n if (!canceled) {\n setIsApiLoading(false);\n }\n });\n return () => {\n canceled = true;\n };\n }, [\n effectiveApi,\n hasPinnedNoProjectSelection,\n projectLocked,\n selectedPath,\n serviceSnapshot.revision,\n service\n ]);\n\n const refreshPreparedSelection = useCallback((): void => {\n if (!effectiveApi) {\n return;\n }\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input).then(\n applyPreparedSelection,\n () => {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n );\n }, [\n effectiveApi,\n projectLocked,\n selectedPath,\n service,\n shouldApplyPreparedSelection\n ]);\n\n const useProjectPath = useCallback(\n async (\n path: string,\n action: WorkspaceUserProjectSelectChangeAction\n ): Promise<void> => {\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n try {\n const project =\n (await effectiveApi.use?.({ path })) ??\n ({\n id: path,\n label: path,\n path\n } satisfies WorkspaceUserProject);\n setApiProjects((current) =>\n upsertWorkspaceUserProject(current, project)\n );\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action });\n refreshPreparedSelection();\n } catch {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n },\n [effectiveApi, onProjectPathChange, refreshPreparedSelection, service]\n );\n\n const createProject = useCallback(async (): Promise<void> => {\n const name = draftProjectName.trim();\n if (!effectiveApi?.create) {\n setProjectCreationError(resolvedLabels.createProjectFailed);\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (!name) {\n setProjectCreationError(resolvedLabels.createProjectNameRequired);\n return;\n }\n setIsCreatingProject(true);\n setProjectCreationError(null);\n try {\n const project = await effectiveApi.create({ name });\n setApiProjects((current) => upsertWorkspaceUserProject(current, project));\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action: \"create_new\" });\n setDraftProjectName(\"\");\n setIsProjectDialogOpen(false);\n refreshPreparedSelection();\n } catch (error) {\n setProjectCreationError(\n resolveProjectCreationErrorLabel(error, resolvedLabels)\n );\n } finally {\n setIsCreatingProject(false);\n }\n }, [\n effectiveApi,\n draftProjectName,\n onProjectPathChange,\n refreshPreparedSelection,\n resolvedLabels,\n service\n ]);\n\n const submitProjectDialog = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void createProject();\n };\n\n const closeProjectDialog = (): void => {\n setIsProjectDialogOpen(false);\n setProjectCreationError(null);\n };\n\n const handleProjectValueChange = (nextValue: string): void => {\n if (!effectiveApi || projectLocked) {\n return;\n }\n if (nextValue === noProjectOptionValue) {\n void effectiveApi.rememberDefaultSelection?.({ path: null });\n setHasPinnedNoProjectSelection(true);\n onProjectPathChange(null, { action: \"clear\" });\n return;\n }\n if (nextValue === addProjectOptionValue) {\n setDraftProjectName(\"\");\n setProjectCreationError(null);\n setIsProjectDialogOpen(true);\n return;\n }\n if (nextValue === linkExistingProjectOptionValue) {\n void Promise.resolve(effectiveApi.selectDirectory?.())\n .then((selection) => {\n const path = selection?.path?.trim() ?? \"\";\n if (!path) {\n return;\n }\n void useProjectPath(path, \"select_existing\");\n })\n .catch(() => {});\n return;\n }\n const knownProject = projects.find((project) => project.path === nextValue);\n if (knownProject) {\n void effectiveApi.rememberDefaultSelection?.({ path: knownProject.path });\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(knownProject.path, { action: \"select_existing\" });\n return;\n }\n void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <style>{workspaceUserProjectOverflowLabelStyle}</style>\n <Select\n disabled={disabled}\n open={isSelectOpen}\n value={selectValue}\n onOpenChange={setIsSelectOpen}\n onValueChange={handleProjectValueChange}\n >\n <SelectTrigger\n aria-label={\n projectLocked\n ? resolvedLabels.projectLocked\n : isUnavailable\n ? resolvedLabels.projectUnavailable\n : resolvedLabels.projectLabel\n }\n className={classNames?.trigger}\n >\n <span\n className=\"workspace-user-project-trigger-label\"\n data-workspace-user-project-trigger-label=\"true\"\n >\n {selectedProject || shouldShowLockedProjectPath ? (\n <FolderIcon aria-hidden className=\"shrink-0\" size={15} />\n ) : (\n <NoWorkspaceLinedIcon\n aria-hidden\n className=\"shrink-0\"\n data-agent-project-trigger-no-workspace-icon=\"true\"\n size={15}\n />\n )}\n <WorkspaceUserProjectOverflowLabel label={triggerLabel} />\n </span>\n </SelectTrigger>\n {isSelectOpen ? (\n <SelectContent\n align={contentAlign}\n className={classNames?.content}\n collisionPadding={16}\n side={contentSide}\n sideOffset={contentSideOffset}\n >\n {visibleProjects.map((project) => {\n const projectLabel =\n resolveWorkspaceUserProjectDisplayLabel(project);\n return (\n <SelectItem\n className={classNames?.item}\n key={project.id || project.path}\n value={project.path}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <FolderIcon aria-hidden size={15} />\n <WorkspaceUserProjectOverflowLabel label={projectLabel} />\n </span>\n </SelectItem>\n );\n })}\n {showProjectActionDivider ? (\n <SelectSeparator\n className=\"mx-[12px] my-1 shrink-0 bg-[var(--line-2)]\"\n data-workspace-user-project-action-separator=\"true\"\n />\n ) : null}\n {hasProjectActions ? (\n <SelectGroup\n className=\"gap-0.5 p-0\"\n data-workspace-user-project-action-group=\"true\"\n >\n {effectiveApi?.selectDirectory ? (\n <SelectItem\n className={classNames?.item}\n value={linkExistingProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <LinkIcon aria-hidden size={15} />\n <span className=\"truncate\">\n {resolvedLabels.linkExistingProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showCreateProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={addProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n {renderAddProjectIcon?.() ?? (\n <NewWorkspaceLinedIcon\n aria-hidden\n data-workspace-user-project-add-icon=\"true\"\n size={15}\n />\n )}\n <span className=\"truncate\">\n {resolvedLabels.addProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showNoProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={noProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <NoWorkspaceLinedIcon\n aria-hidden\n data-agent-project-no-workspace-icon=\"true\"\n size={15}\n />\n <span className=\"truncate\">\n {resolvedLabels.noProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n </SelectGroup>\n ) : null}\n </SelectContent>\n ) : null}\n </Select>\n {isProjectDialogOpen ? (\n <Dialog\n open\n onOpenChange={(nextOpen) => !nextOpen && closeProjectDialog()}\n >\n <DialogContent\n className=\"w-[480px] max-w-[calc(100vw-32px)] sm:max-w-[480px]\"\n showCloseButton={false}\n >\n <form className=\"grid gap-4\" onSubmit={submitProjectDialog}>\n <DialogHeader>\n <DialogTitle>{resolvedLabels.createProjectTitle}</DialogTitle>\n <DialogDescription>\n {resolvedLabels.createProjectNameLabel}\n </DialogDescription>\n </DialogHeader>\n <label className=\"grid gap-1.5\">\n <span className=\"sr-only\">\n {resolvedLabels.createProjectNameLabel}\n </span>\n <Input\n autoFocus\n className=\"h-10\"\n disabled={isCreatingProject}\n placeholder={resolvedLabels.createProjectNamePlaceholder}\n value={draftProjectName}\n onChange={(event) => {\n setDraftProjectName(event.target.value);\n if (projectCreationError) {\n setProjectCreationError(null);\n }\n }}\n />\n </label>\n {projectCreationError ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {projectCreationError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={isCreatingProject}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={closeProjectDialog}\n onPointerDown={(event) => {\n if (event.button === 0 && !isCreatingProject) {\n closeProjectDialog();\n }\n }}\n >\n {resolvedLabels.createProjectCancel}\n </Button>\n <Button\n disabled={isCreatingProject || !draftProjectName.trim()}\n size=\"dialog\"\n type=\"submit\"\n >\n {resolvedLabels.createProjectConfirm}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceUserProjectOverflowLabel({\n className,\n label\n}: {\n className?: string;\n label: string;\n}): React.JSX.Element {\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const contentRef = useRef<HTMLSpanElement | null>(null);\n const updateMarqueeDistance = useCallback(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content) {\n return;\n }\n const overflowDistance = content.scrollWidth - root.clientWidth;\n if (overflowDistance <= 1) {\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n \"0px\"\n );\n root.removeAttribute(\"data-overflow\");\n return;\n }\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n `${-overflowDistance}px`\n );\n root.setAttribute(\"data-overflow\", \"true\");\n }, []);\n\n useEffect(() => {\n updateMarqueeDistance();\n\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content || typeof globalThis.ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new globalThis.ResizeObserver(updateMarqueeDistance);\n observer.observe(root);\n observer.observe(content);\n return () => observer.disconnect();\n }, [label, updateMarqueeDistance]);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"workspace-user-project-overflow-label\", className)}\n data-workspace-user-project-overflow-label=\"true\"\n onFocus={updateMarqueeDistance}\n onPointerEnter={updateMarqueeDistance}\n >\n <span\n ref={contentRef}\n className=\"workspace-user-project-overflow-label__content\"\n >\n {label}\n </span>\n </span>\n );\n}\n\nfunction createWorkspaceUserProjectApiAdapter(\n api: WorkspaceUserProjectApi | null | undefined,\n service: WorkspaceUserProjectService | null | undefined\n): WorkspaceUserProjectApi | null {\n if (!service) {\n return api ?? null;\n }\n const apiCheckPath = hasWorkspaceUserProjectMethod(api, \"checkPath\")\n ? (input: { path: string }) => api!.checkPath!(input)\n : undefined;\n const apiCreate = hasWorkspaceUserProjectMethod(api, \"create\")\n ? (input: { name: string }) => api!.create!(input)\n : undefined;\n const apiGetDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"getDefaultSelection\"\n )\n ? () => api!.getDefaultSelection!()\n : undefined;\n const apiIsNoProjectPath = hasWorkspaceUserProjectMethod(\n api,\n \"isNoProjectPath\"\n )\n ? (input: { path: string }) => api!.isNoProjectPath!(input)\n : undefined;\n const apiRememberDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"rememberDefaultSelection\"\n )\n ? (input: { path: string | null }) => api!.rememberDefaultSelection!(input)\n : undefined;\n const apiSelectDirectory = hasWorkspaceUserProjectMethod(\n api,\n \"selectDirectory\"\n )\n ? () => api!.selectDirectory!()\n : undefined;\n const apiUse = hasWorkspaceUserProjectMethod(api, \"use\")\n ? (input: { path: string }) => api!.use!(input)\n : undefined;\n return {\n checkPath: hasWorkspaceUserProjectMethod(service, \"checkProjectPath\")\n ? ({ path }) => service.checkProjectPath!(path)\n : apiCheckPath,\n create: hasWorkspaceUserProjectMethod(service, \"createProject\")\n ? ({ name }) => service.createProject!(name)\n : apiCreate,\n getDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"getDefaultSelection\"\n )\n ? () => service.getDefaultSelection!()\n : apiGetDefaultSelection,\n isNoProjectPath: hasWorkspaceUserProjectMethod(service, \"isNoProjectPath\")\n ? ({ path }) => service.isNoProjectPath!(path)\n : apiIsNoProjectPath,\n list: async () => {\n await (service.ensureLoaded?.() ?? service.refresh());\n return { projects: [...service.store.projects] };\n },\n prepareSelection: (input) => service.prepareSelection(input),\n rememberDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"rememberDefaultSelection\"\n )\n ? ({ path }) => service.rememberDefaultSelection!({ path })\n : apiRememberDefaultSelection,\n selectDirectory: hasWorkspaceUserProjectMethod(service, \"selectDirectory\")\n ? () => service.selectDirectory!()\n : apiSelectDirectory,\n use: hasWorkspaceUserProjectMethod(service, \"registerProjectPath\")\n ? ({ path }) => service.registerProjectPath!(path)\n : apiUse\n };\n}\n\nfunction hasWorkspaceUserProjectMethod(\n value: object | null | undefined,\n key: string\n): boolean {\n return value ? typeof Reflect.get(value, key) === \"function\" : false;\n}\n\nfunction setApiUnavailableUnlessService(\n setIsApiUnavailable: (value: boolean) => void,\n service: WorkspaceUserProjectService | null | undefined,\n value = true\n): void {\n if (!service) {\n setIsApiUnavailable(value);\n }\n}\n\nexport function resolveWorkspaceUserProjectSelectLabels(\n i18n: WorkspaceUserProjectI18nRuntime = defaultWorkspaceUserProjectSelectI18n,\n overrides?: WorkspaceUserProjectSelectLabelOverrides\n): WorkspaceUserProjectSelectLabels {\n return {\n addProject: overrides?.addProject ?? i18n.t(\"projectSelect.addProject\"),\n createProjectCancel:\n overrides?.createProjectCancel ??\n i18n.t(\"projectSelect.createProjectCancel\"),\n createProjectConfirm:\n overrides?.createProjectConfirm ??\n i18n.t(\"projectSelect.createProjectConfirm\"),\n createProjectDocumentsUnavailable:\n overrides?.createProjectDocumentsUnavailable ??\n i18n.t(\"projectSelect.createProjectDocumentsUnavailable\"),\n createProjectFailed:\n overrides?.createProjectFailed ??\n i18n.t(\"projectSelect.createProjectFailed\"),\n createProjectNameConflict:\n overrides?.createProjectNameConflict ??\n i18n.t(\"projectSelect.createProjectNameConflict\"),\n createProjectNameInvalid:\n overrides?.createProjectNameInvalid ??\n i18n.t(\"projectSelect.createProjectNameInvalid\"),\n createProjectNameLabel:\n overrides?.createProjectNameLabel ??\n i18n.t(\"projectSelect.createProjectNameLabel\"),\n createProjectNamePlaceholder:\n overrides?.createProjectNamePlaceholder ??\n i18n.t(\"projectSelect.createProjectNamePlaceholder\"),\n createProjectNameRequired:\n overrides?.createProjectNameRequired ??\n i18n.t(\"projectSelect.createProjectNameRequired\"),\n createProjectPermissionDenied:\n overrides?.createProjectPermissionDenied ??\n i18n.t(\"projectSelect.createProjectPermissionDenied\"),\n createProjectTitle:\n overrides?.createProjectTitle ??\n i18n.t(\"projectSelect.createProjectTitle\"),\n linkExistingProject:\n overrides?.linkExistingProject ??\n i18n.t(\"projectSelect.linkExistingProject\"),\n loadingProjects:\n overrides?.loadingProjects ?? i18n.t(\"projectSelect.loadingProjects\"),\n noProject: overrides?.noProject ?? i18n.t(\"projectSelect.noProject\"),\n projectLabel:\n overrides?.projectLabel ?? i18n.t(\"projectSelect.projectLabel\"),\n projectLocked:\n overrides?.projectLocked ?? i18n.t(\"projectSelect.projectLocked\"),\n projectMissingTitle:\n overrides?.projectMissingTitle ??\n i18n.t(\"projectSelect.projectMissingTitle\"),\n projectUnavailable:\n overrides?.projectUnavailable ??\n i18n.t(\"projectSelect.projectUnavailable\")\n };\n}\n\nfunction resolveProjectCreationErrorLabel(\n error: unknown,\n labels: WorkspaceUserProjectSelectLabels\n): string {\n switch (getWorkspaceUserProjectErrorCode(error)) {\n case \"EEXIST\":\n case \"project_directory_already_exists\":\n return labels.createProjectNameConflict;\n case \"project_name_invalid\":\n return labels.createProjectNameInvalid;\n case \"EACCES\":\n case \"EPERM\":\n case \"project_directory_permission_denied\":\n return labels.createProjectPermissionDenied;\n case \"ENOENT\":\n case \"project_documents_unavailable\":\n return labels.createProjectDocumentsUnavailable;\n default:\n return labels.createProjectFailed;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/internal/project/WorkspaceUserProjectSelect.tsx"],"sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { proxy } from \"valtio/vanilla\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n FolderIcon,\n Input,\n LinkIcon,\n NewWorkspaceLinedIcon,\n NoWorkspaceLinedIcon,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectService\n} from \"../../../contracts/index.ts\";\nimport {\n basenameWorkspaceUserProjectPath,\n getWorkspaceUserProjectErrorCode,\n prepareWorkspaceUserProjectSelection,\n resolveWorkspaceUserProjectDisplayLabel,\n upsertWorkspaceUserProject\n} from \"../../../core/index.ts\";\nimport {\n createDefaultWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"../../../i18n/index.ts\";\n\nexport type WorkspaceUserProjectSelectLabels = {\n addProject: string;\n createProjectCancel: string;\n createProjectConfirm: string;\n createProjectDocumentsUnavailable: string;\n createProjectFailed: string;\n createProjectNameConflict: string;\n createProjectNameInvalid: string;\n createProjectNameLabel: string;\n createProjectNamePlaceholder: string;\n createProjectNameRequired: string;\n createProjectPermissionDenied: string;\n createProjectTitle: string;\n linkExistingProject: string;\n loadingProjects: string;\n noProject: string;\n projectLabel: string;\n projectLocked: string;\n projectMissingTitle: string;\n projectUnavailable: string;\n};\n\nexport type WorkspaceUserProjectSelectLabelOverrides =\n Partial<WorkspaceUserProjectSelectLabels>;\n\nexport interface WorkspaceUserProjectSelectClassNames {\n content?: string;\n item?: string;\n trigger?: string;\n}\n\nexport type WorkspaceUserProjectSelectChangeAction =\n | \"clear\"\n | \"create_new\"\n | \"select_existing\";\n\nexport interface WorkspaceUserProjectSelectProps {\n api?: WorkspaceUserProjectApi | null;\n classNames?: WorkspaceUserProjectSelectClassNames;\n contentAlign?: \"center\" | \"end\" | \"start\";\n contentSide?: \"bottom\" | \"left\" | \"right\" | \"top\";\n contentSideOffset?: number;\n disabled?: boolean;\n i18n?: WorkspaceUserProjectI18nRuntime;\n labels?: WorkspaceUserProjectSelectLabelOverrides;\n onProjectMissingChange?: (isMissing: boolean) => void;\n onProjectPathChange: (\n path: string | null,\n metadata?: {\n action: WorkspaceUserProjectSelectChangeAction;\n project?: WorkspaceUserProject;\n }\n ) => void;\n projectLocked?: boolean;\n renderAddProjectIcon?: () => ReactNode;\n shouldApplyPreparedSelection?: boolean;\n showKnownProjectOptions?: boolean;\n service?: WorkspaceUserProjectService | null;\n selectedProjectPath?: string | null;\n showCreateProjectAction?: boolean;\n showNoProjectAction?: boolean;\n unlistedProjectLabel?: string;\n}\n\nconst noProjectOptionValue = \"__tutti_no_project__\";\nconst addProjectOptionValue = \"__tutti_add_project__\";\nconst linkExistingProjectOptionValue = \"__tutti_link_existing_project__\";\nconst workspaceUserProjectOverflowLabelStyle = `\n@keyframes workspace-user-project-label-marquee {\n 0% {\n transform: translateX(0);\n }\n\n 44%,\n 56% {\n transform: translateX(var(--workspace-user-project-label-marquee-distance, 0px));\n }\n\n 88%,\n 100% {\n transform: translateX(0);\n }\n}\n\n.workspace-user-project-overflow-label {\n --workspace-user-project-label-marquee-distance: 0px;\n container-type: normal;\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.workspace-user-project-trigger-label {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n gap: 0.5rem;\n min-width: 0;\n}\n\n.workspace-user-project-overflow-label__content {\n display: block;\n max-width: 100%;\n min-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n transform: translateX(0);\n white-space: nowrap;\n width: max-content;\n}\n\n.workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n[data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: workspace-user-project-label-marquee 14s linear infinite;\n max-width: none;\n overflow: visible;\n text-overflow: clip;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .workspace-user-project-overflow-label[data-overflow=\"true\"]:hover\n .workspace-user-project-overflow-label__content,\n [data-slot=\"select-item\"]:hover\n .workspace-user-project-overflow-label[data-overflow=\"true\"]\n .workspace-user-project-overflow-label__content {\n animation: none;\n }\n}\n`;\nconst defaultWorkspaceUserProjectSelectI18n =\n createDefaultWorkspaceUserProjectI18nRuntime();\nconst emptyWorkspaceUserProjectServiceSnapshot = proxy({\n error: null,\n initialized: false,\n isLoading: false,\n projects: [],\n revision: 0\n});\n\nexport function WorkspaceUserProjectSelect({\n api,\n classNames,\n contentAlign = \"start\",\n contentSide = \"top\",\n contentSideOffset = 4,\n disabled: disabledProp = false,\n i18n = defaultWorkspaceUserProjectSelectI18n,\n labels,\n onProjectMissingChange,\n onProjectPathChange,\n projectLocked = false,\n renderAddProjectIcon,\n shouldApplyPreparedSelection = true,\n showKnownProjectOptions = true,\n service,\n selectedProjectPath,\n showCreateProjectAction = hasWorkspaceUserProjectMethod(\n service,\n \"createProject\"\n ) || hasWorkspaceUserProjectMethod(api, \"create\"),\n showNoProjectAction = true,\n unlistedProjectLabel\n}: WorkspaceUserProjectSelectProps): React.JSX.Element {\n \"use memo\";\n const serviceSnapshot = useSnapshot(\n service?.store ?? emptyWorkspaceUserProjectServiceSnapshot\n );\n const effectiveApi = useMemo(\n () => createWorkspaceUserProjectApiAdapter(api, service),\n [api, service]\n );\n const resolvedLabels = useMemo(\n () => resolveWorkspaceUserProjectSelectLabels(i18n, labels),\n [i18n, labels]\n );\n const createProjectNameDescription =\n resolvedLabels.createProjectNameLabel.trim();\n const createProjectNameInputLabel =\n createProjectNameDescription ||\n resolvedLabels.createProjectNamePlaceholder.trim();\n const [apiProjects, setApiProjects] = useState<WorkspaceUserProject[]>([]);\n const [isApiLoading, setIsApiLoading] = useState(false);\n const [isApiUnavailable, setIsApiUnavailable] = useState(!effectiveApi);\n const [isProjectDialogOpen, setIsProjectDialogOpen] = useState(false);\n const [isSelectOpen, setIsSelectOpen] = useState(false);\n const [draftProjectName, setDraftProjectName] = useState(\"\");\n const [projectCreationError, setProjectCreationError] = useState<\n string | null\n >(null);\n const [isCreatingProject, setIsCreatingProject] = useState(false);\n const [suppressedSelectedPath, setSuppressedSelectedPath] = useState<\n string | null\n >(null);\n const [hasPinnedNoProjectSelection, setHasPinnedNoProjectSelection] =\n useState(false);\n const [isSelectedPathMissing, setIsSelectedPathMissing] = useState(false);\n const rawSelectedPath = selectedProjectPath?.trim() ?? \"\";\n const selectedPath =\n rawSelectedPath && rawSelectedPath === suppressedSelectedPath\n ? \"\"\n : rawSelectedPath;\n const projects = service ? [...serviceSnapshot.projects] : apiProjects;\n const visibleProjects = showKnownProjectOptions ? projects : [];\n const isLoading = service\n ? serviceSnapshot.isLoading && !serviceSnapshot.initialized\n : isApiLoading;\n const isUnavailable = service\n ? Boolean(serviceSnapshot.error) && !serviceSnapshot.initialized\n : isApiUnavailable;\n const selectedPathLabel =\n basenameWorkspaceUserProjectPath(selectedPath) || selectedPath;\n const selectedProject = showKnownProjectOptions\n ? (projects.find((project) => project.path === selectedPath) ?? null)\n : null;\n const selectedProjectLabel = selectedProject\n ? resolveWorkspaceUserProjectDisplayLabel(selectedProject)\n : \"\";\n const isSelectedNoProjectPath =\n Boolean(selectedPath) &&\n Boolean(effectiveApi?.isNoProjectPath?.({ path: selectedPath }));\n const shouldShowMissingProjectNotice = isSelectedPathMissing;\n const shouldShowLockedProjectPath =\n projectLocked &&\n selectedPath !== \"\" &&\n !isSelectedNoProjectPath &&\n !selectedProject &&\n !isSelectedPathMissing;\n const selectValue = selectedProject\n ? selectedProject.path\n : noProjectOptionValue;\n const triggerLabel = shouldShowMissingProjectNotice\n ? resolvedLabels.projectMissingTitle\n : isSelectedNoProjectPath\n ? resolvedLabels.noProject\n : shouldShowLockedProjectPath\n ? selectedPathLabel\n : selectedProject\n ? selectedProjectLabel\n : selectedPath\n ? unlistedProjectLabel || selectedPathLabel\n : isLoading\n ? resolvedLabels.loadingProjects\n : resolvedLabels.noProject;\n const shouldDisableWhileLoading =\n showKnownProjectOptions || shouldApplyPreparedSelection;\n const disabled =\n disabledProp ||\n projectLocked ||\n (shouldDisableWhileLoading && isLoading) ||\n !effectiveApi;\n const hasProjectActions =\n Boolean(effectiveApi?.selectDirectory) ||\n showCreateProjectAction ||\n showNoProjectAction;\n const showProjectActionDivider =\n visibleProjects.length > 0 && hasProjectActions;\n\n useEffect(() => {\n if (!disabled || !isSelectOpen) {\n return;\n }\n setIsSelectOpen(false);\n }, [disabled, isSelectOpen]);\n\n useEffect(() => {\n onProjectMissingChange?.(shouldShowMissingProjectNotice);\n }, [onProjectMissingChange, shouldShowMissingProjectNotice]);\n\n useEffect(() => {\n if (rawSelectedPath) {\n setHasPinnedNoProjectSelection(false);\n }\n if (\n suppressedSelectedPath &&\n (!rawSelectedPath || rawSelectedPath !== suppressedSelectedPath)\n ) {\n setSuppressedSelectedPath(null);\n }\n }, [rawSelectedPath, suppressedSelectedPath]);\n\n const applyPreparedSelection = useEffectEvent(\n (prepared: WorkspaceUserProjectSelectionPreparation): void => {\n if (!service) {\n setApiProjects(prepared.projects);\n }\n setIsSelectedPathMissing(prepared.isSelectedPathMissing);\n if (!shouldApplyPreparedSelection) {\n return;\n }\n if (prepared.selection.kind === \"clear\") {\n setHasPinnedNoProjectSelection(true);\n setSuppressedSelectedPath(prepared.selection.suppressedPath);\n onProjectPathChange(null);\n return;\n }\n if (prepared.selection.kind === \"select\") {\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(prepared.selection.path);\n }\n }\n );\n\n useEffect(() => {\n let canceled = false;\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (hasPinnedNoProjectSelection) {\n return;\n }\n setIsApiLoading(true);\n setApiUnavailableUnlessService(setIsApiUnavailable, service, false);\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input)\n .then((prepared) => {\n if (!canceled) {\n applyPreparedSelection(prepared);\n }\n })\n .catch(() => {\n if (!canceled) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n })\n .finally(() => {\n if (!canceled) {\n setIsApiLoading(false);\n }\n });\n return () => {\n canceled = true;\n };\n }, [\n effectiveApi,\n hasPinnedNoProjectSelection,\n projectLocked,\n selectedPath,\n serviceSnapshot.revision,\n service\n ]);\n\n const refreshPreparedSelection = useCallback((): void => {\n if (!effectiveApi) {\n return;\n }\n const input = {\n projectLocked,\n selectedPath\n } satisfies WorkspaceUserProjectSelectionPreparationInput;\n void prepareWorkspaceUserProjectSelection(effectiveApi, input).then(\n applyPreparedSelection,\n () => {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n );\n }, [\n effectiveApi,\n projectLocked,\n selectedPath,\n service,\n shouldApplyPreparedSelection\n ]);\n\n const useProjectPath = useCallback(\n async (\n path: string,\n action: WorkspaceUserProjectSelectChangeAction\n ): Promise<void> => {\n if (!effectiveApi) {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n try {\n const project =\n (await effectiveApi.use?.({ path })) ??\n ({\n id: path,\n label: path,\n path\n } satisfies WorkspaceUserProject);\n setApiProjects((current) =>\n upsertWorkspaceUserProject(current, project)\n );\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action, project });\n refreshPreparedSelection();\n } catch {\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n }\n },\n [effectiveApi, onProjectPathChange, refreshPreparedSelection, service]\n );\n\n const createProject = useCallback(async (): Promise<void> => {\n const name = draftProjectName.trim();\n if (!effectiveApi?.create) {\n setProjectCreationError(resolvedLabels.createProjectFailed);\n setApiUnavailableUnlessService(setIsApiUnavailable, service);\n return;\n }\n if (!name) {\n setProjectCreationError(resolvedLabels.createProjectNameRequired);\n return;\n }\n setIsCreatingProject(true);\n setProjectCreationError(null);\n try {\n const project = await effectiveApi.create({ name });\n setApiProjects((current) => upsertWorkspaceUserProject(current, project));\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(project.path, { action: \"create_new\", project });\n setDraftProjectName(\"\");\n setIsProjectDialogOpen(false);\n refreshPreparedSelection();\n } catch (error) {\n setProjectCreationError(\n resolveProjectCreationErrorLabel(error, resolvedLabels)\n );\n } finally {\n setIsCreatingProject(false);\n }\n }, [\n effectiveApi,\n draftProjectName,\n onProjectPathChange,\n refreshPreparedSelection,\n resolvedLabels,\n service\n ]);\n\n const submitProjectDialog = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void createProject();\n };\n\n const closeProjectDialog = (): void => {\n setIsProjectDialogOpen(false);\n setProjectCreationError(null);\n };\n\n const handleProjectValueChange = (nextValue: string): void => {\n if (!effectiveApi || projectLocked) {\n return;\n }\n if (nextValue === noProjectOptionValue) {\n void effectiveApi.rememberDefaultSelection?.({ path: null });\n setHasPinnedNoProjectSelection(true);\n onProjectPathChange(null, { action: \"clear\" });\n return;\n }\n if (nextValue === addProjectOptionValue) {\n setDraftProjectName(\"\");\n setProjectCreationError(null);\n setIsProjectDialogOpen(true);\n return;\n }\n if (nextValue === linkExistingProjectOptionValue) {\n void Promise.resolve(effectiveApi.selectDirectory?.())\n .then((selection) => {\n const path = selection?.path?.trim() ?? \"\";\n if (!path) {\n return;\n }\n void useProjectPath(path, \"select_existing\");\n })\n .catch(() => {});\n return;\n }\n const knownProject = projects.find((project) => project.path === nextValue);\n if (knownProject) {\n void effectiveApi.rememberDefaultSelection?.({ path: knownProject.path });\n setHasPinnedNoProjectSelection(false);\n onProjectPathChange(knownProject.path, { action: \"select_existing\" });\n return;\n }\n void useProjectPath(nextValue, \"select_existing\");\n };\n\n return (\n <>\n <style>{workspaceUserProjectOverflowLabelStyle}</style>\n <Select\n disabled={disabled}\n open={isSelectOpen}\n value={selectValue}\n onOpenChange={setIsSelectOpen}\n onValueChange={handleProjectValueChange}\n >\n <SelectTrigger\n aria-label={\n projectLocked\n ? resolvedLabels.projectLocked\n : isUnavailable\n ? resolvedLabels.projectUnavailable\n : resolvedLabels.projectLabel\n }\n className={classNames?.trigger}\n >\n <span\n className=\"workspace-user-project-trigger-label\"\n data-workspace-user-project-trigger-label=\"true\"\n >\n {selectedProject || shouldShowLockedProjectPath ? (\n <FolderIcon aria-hidden className=\"shrink-0\" size={15} />\n ) : (\n <NoWorkspaceLinedIcon\n aria-hidden\n className=\"shrink-0\"\n data-agent-project-trigger-no-workspace-icon=\"true\"\n size={15}\n />\n )}\n <WorkspaceUserProjectOverflowLabel label={triggerLabel} />\n </span>\n </SelectTrigger>\n {isSelectOpen ? (\n <SelectContent\n align={contentAlign}\n className={classNames?.content}\n collisionPadding={16}\n side={contentSide}\n sideOffset={contentSideOffset}\n >\n {visibleProjects.map((project) => {\n const projectLabel =\n resolveWorkspaceUserProjectDisplayLabel(project);\n return (\n <SelectItem\n className={classNames?.item}\n key={project.id || project.path}\n value={project.path}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <FolderIcon aria-hidden size={15} />\n <WorkspaceUserProjectOverflowLabel label={projectLabel} />\n </span>\n </SelectItem>\n );\n })}\n {showProjectActionDivider ? (\n <SelectSeparator\n className=\"mx-[12px] my-1 shrink-0 bg-[var(--line-2)]\"\n data-workspace-user-project-action-separator=\"true\"\n />\n ) : null}\n {hasProjectActions ? (\n <SelectGroup\n className=\"gap-0.5 p-0\"\n data-workspace-user-project-action-group=\"true\"\n >\n {effectiveApi?.selectDirectory ? (\n <SelectItem\n className={classNames?.item}\n value={linkExistingProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <LinkIcon aria-hidden size={15} />\n <span className=\"truncate\">\n {resolvedLabels.linkExistingProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showCreateProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={addProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n {renderAddProjectIcon?.() ?? (\n <NewWorkspaceLinedIcon\n aria-hidden\n data-workspace-user-project-add-icon=\"true\"\n size={15}\n />\n )}\n <span className=\"truncate\">\n {resolvedLabels.addProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n {showNoProjectAction ? (\n <SelectItem\n className={classNames?.item}\n value={noProjectOptionValue}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <NoWorkspaceLinedIcon\n aria-hidden\n data-agent-project-no-workspace-icon=\"true\"\n size={15}\n />\n <span className=\"truncate\">\n {resolvedLabels.noProject}\n </span>\n </span>\n </SelectItem>\n ) : null}\n </SelectGroup>\n ) : null}\n </SelectContent>\n ) : null}\n </Select>\n {isProjectDialogOpen ? (\n <Dialog\n open\n onOpenChange={(nextOpen) => !nextOpen && closeProjectDialog()}\n >\n <DialogContent\n className=\"w-[480px] max-w-[calc(100vw-32px)] sm:max-w-[480px]\"\n showCloseButton={false}\n >\n <form className=\"grid gap-4\" onSubmit={submitProjectDialog}>\n <DialogHeader>\n <DialogTitle>{resolvedLabels.createProjectTitle}</DialogTitle>\n {createProjectNameDescription ? (\n <DialogDescription>\n {createProjectNameDescription}\n </DialogDescription>\n ) : null}\n </DialogHeader>\n <label className=\"grid gap-1.5\">\n <span className=\"sr-only\">{createProjectNameInputLabel}</span>\n <Input\n autoFocus\n className=\"h-10\"\n disabled={isCreatingProject}\n placeholder={resolvedLabels.createProjectNamePlaceholder}\n value={draftProjectName}\n onChange={(event) => {\n setDraftProjectName(event.target.value);\n if (projectCreationError) {\n setProjectCreationError(null);\n }\n }}\n />\n </label>\n {projectCreationError ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {projectCreationError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={isCreatingProject}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={closeProjectDialog}\n onPointerDown={(event) => {\n if (event.button === 0 && !isCreatingProject) {\n closeProjectDialog();\n }\n }}\n >\n {resolvedLabels.createProjectCancel}\n </Button>\n <Button\n disabled={isCreatingProject || !draftProjectName.trim()}\n size=\"dialog\"\n type=\"submit\"\n >\n {resolvedLabels.createProjectConfirm}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceUserProjectOverflowLabel({\n className,\n label\n}: {\n className?: string;\n label: string;\n}): React.JSX.Element {\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const contentRef = useRef<HTMLSpanElement | null>(null);\n const updateMarqueeDistance = useCallback(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content) {\n return;\n }\n const overflowDistance = content.scrollWidth - root.clientWidth;\n if (overflowDistance <= 1) {\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n \"0px\"\n );\n root.removeAttribute(\"data-overflow\");\n return;\n }\n root.style.setProperty(\n \"--workspace-user-project-label-marquee-distance\",\n `${-overflowDistance}px`\n );\n root.setAttribute(\"data-overflow\", \"true\");\n }, []);\n\n useEffect(() => {\n updateMarqueeDistance();\n\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content || typeof globalThis.ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new globalThis.ResizeObserver(updateMarqueeDistance);\n observer.observe(root);\n observer.observe(content);\n return () => observer.disconnect();\n }, [label, updateMarqueeDistance]);\n\n return (\n <span\n ref={rootRef}\n className={cn(\"workspace-user-project-overflow-label\", className)}\n data-workspace-user-project-overflow-label=\"true\"\n onFocus={updateMarqueeDistance}\n onPointerEnter={updateMarqueeDistance}\n >\n <span\n ref={contentRef}\n className=\"workspace-user-project-overflow-label__content\"\n >\n {label}\n </span>\n </span>\n );\n}\n\nfunction createWorkspaceUserProjectApiAdapter(\n api: WorkspaceUserProjectApi | null | undefined,\n service: WorkspaceUserProjectService | null | undefined\n): WorkspaceUserProjectApi | null {\n if (!service) {\n return api ?? null;\n }\n const apiCheckPath = hasWorkspaceUserProjectMethod(api, \"checkPath\")\n ? (input: { path: string }) => api!.checkPath!(input)\n : undefined;\n const apiCreate = hasWorkspaceUserProjectMethod(api, \"create\")\n ? (input: { name: string }) => api!.create!(input)\n : undefined;\n const apiGetDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"getDefaultSelection\"\n )\n ? () => api!.getDefaultSelection!()\n : undefined;\n const apiIsNoProjectPath = hasWorkspaceUserProjectMethod(\n api,\n \"isNoProjectPath\"\n )\n ? (input: { path: string }) => api!.isNoProjectPath!(input)\n : undefined;\n const apiRememberDefaultSelection = hasWorkspaceUserProjectMethod(\n api,\n \"rememberDefaultSelection\"\n )\n ? (input: { path: string | null }) => api!.rememberDefaultSelection!(input)\n : undefined;\n const apiSelectDirectory = hasWorkspaceUserProjectMethod(\n api,\n \"selectDirectory\"\n )\n ? () => api!.selectDirectory!()\n : undefined;\n const apiUse = hasWorkspaceUserProjectMethod(api, \"use\")\n ? (input: { path: string }) => api!.use!(input)\n : undefined;\n return {\n checkPath: hasWorkspaceUserProjectMethod(service, \"checkProjectPath\")\n ? ({ path }) => service.checkProjectPath!(path)\n : apiCheckPath,\n create:\n apiCreate ??\n (hasWorkspaceUserProjectMethod(service, \"createProject\")\n ? ({ name }) => service.createProject!(name)\n : undefined),\n getDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"getDefaultSelection\"\n )\n ? () => service.getDefaultSelection!()\n : apiGetDefaultSelection,\n isNoProjectPath: hasWorkspaceUserProjectMethod(service, \"isNoProjectPath\")\n ? ({ path }) => service.isNoProjectPath!(path)\n : apiIsNoProjectPath,\n list: async () => {\n await (service.ensureLoaded?.() ?? service.refresh());\n return { projects: [...service.store.projects] };\n },\n prepareSelection: (input) => service.prepareSelection(input),\n rememberDefaultSelection: hasWorkspaceUserProjectMethod(\n service,\n \"rememberDefaultSelection\"\n )\n ? ({ path }) => service.rememberDefaultSelection!({ path })\n : apiRememberDefaultSelection,\n selectDirectory:\n apiSelectDirectory ??\n (hasWorkspaceUserProjectMethod(service, \"selectDirectory\")\n ? () => service.selectDirectory!()\n : undefined),\n use: hasWorkspaceUserProjectMethod(service, \"registerProjectPath\")\n ? ({ path }) => service.registerProjectPath!(path)\n : apiUse\n };\n}\n\nfunction hasWorkspaceUserProjectMethod(\n value: object | null | undefined,\n key: string\n): boolean {\n return value ? typeof Reflect.get(value, key) === \"function\" : false;\n}\n\nfunction setApiUnavailableUnlessService(\n setIsApiUnavailable: (value: boolean) => void,\n service: WorkspaceUserProjectService | null | undefined,\n value = true\n): void {\n if (!service) {\n setIsApiUnavailable(value);\n }\n}\n\nexport function resolveWorkspaceUserProjectSelectLabels(\n i18n: WorkspaceUserProjectI18nRuntime = defaultWorkspaceUserProjectSelectI18n,\n overrides?: WorkspaceUserProjectSelectLabelOverrides\n): WorkspaceUserProjectSelectLabels {\n return {\n addProject: overrides?.addProject ?? i18n.t(\"projectSelect.addProject\"),\n createProjectCancel:\n overrides?.createProjectCancel ??\n i18n.t(\"projectSelect.createProjectCancel\"),\n createProjectConfirm:\n overrides?.createProjectConfirm ??\n i18n.t(\"projectSelect.createProjectConfirm\"),\n createProjectDocumentsUnavailable:\n overrides?.createProjectDocumentsUnavailable ??\n i18n.t(\"projectSelect.createProjectDocumentsUnavailable\"),\n createProjectFailed:\n overrides?.createProjectFailed ??\n i18n.t(\"projectSelect.createProjectFailed\"),\n createProjectNameConflict:\n overrides?.createProjectNameConflict ??\n i18n.t(\"projectSelect.createProjectNameConflict\"),\n createProjectNameInvalid:\n overrides?.createProjectNameInvalid ??\n i18n.t(\"projectSelect.createProjectNameInvalid\"),\n createProjectNameLabel:\n overrides?.createProjectNameLabel ??\n i18n.t(\"projectSelect.createProjectNameLabel\"),\n createProjectNamePlaceholder:\n overrides?.createProjectNamePlaceholder ??\n i18n.t(\"projectSelect.createProjectNamePlaceholder\"),\n createProjectNameRequired:\n overrides?.createProjectNameRequired ??\n i18n.t(\"projectSelect.createProjectNameRequired\"),\n createProjectPermissionDenied:\n overrides?.createProjectPermissionDenied ??\n i18n.t(\"projectSelect.createProjectPermissionDenied\"),\n createProjectTitle:\n overrides?.createProjectTitle ??\n i18n.t(\"projectSelect.createProjectTitle\"),\n linkExistingProject:\n overrides?.linkExistingProject ??\n i18n.t(\"projectSelect.linkExistingProject\"),\n loadingProjects:\n overrides?.loadingProjects ?? i18n.t(\"projectSelect.loadingProjects\"),\n noProject: overrides?.noProject ?? i18n.t(\"projectSelect.noProject\"),\n projectLabel:\n overrides?.projectLabel ?? i18n.t(\"projectSelect.projectLabel\"),\n projectLocked:\n overrides?.projectLocked ?? i18n.t(\"projectSelect.projectLocked\"),\n projectMissingTitle:\n overrides?.projectMissingTitle ??\n i18n.t(\"projectSelect.projectMissingTitle\"),\n projectUnavailable:\n overrides?.projectUnavailable ??\n i18n.t(\"projectSelect.projectUnavailable\")\n };\n}\n\nfunction resolveProjectCreationErrorLabel(\n error: unknown,\n labels: WorkspaceUserProjectSelectLabels\n): string {\n switch (getWorkspaceUserProjectErrorCode(error)) {\n case \"EEXIST\":\n case \"project_directory_already_exists\":\n return labels.createProjectNameConflict;\n case \"project_name_invalid\":\n return labels.createProjectNameInvalid;\n case \"EACCES\":\n case \"EPERM\":\n case \"project_directory_permission_denied\":\n return labels.createProjectPermissionDenied;\n case \"ENOENT\":\n case \"project_documents_unavailable\":\n return labels.createProjectDocumentsUnavailable;\n default:\n return labels.createProjectFailed;\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/workspace-user-project",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"directory": "packages/workspace/user-project"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
40
|
-
"@tutti-os/ui-system": "0.0.
|
|
39
|
+
"@tutti-os/ui-i18n-runtime": "0.0.38",
|
|
40
|
+
"@tutti-os/ui-system": "0.0.38",
|
|
41
41
|
"valtio": "^2.3.2"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import type {\n WorkspaceUserProject,\n WorkspaceUserProjectApi,\n WorkspaceUserProjectCreationErrorCode,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput\n} from \"../contracts/index.ts\";\n\nexport function upsertWorkspaceUserProject(\n projects: readonly WorkspaceUserProject[],\n project: WorkspaceUserProject\n): WorkspaceUserProject[] {\n const existingIndex = projects.findIndex(\n (item) => item.id === project.id || item.path === project.path\n );\n if (existingIndex < 0) {\n return [project, ...projects];\n }\n const next = [...projects];\n next[existingIndex] = project;\n return next;\n}\n\nexport function resolveWorkspaceUserProjectDisplayLabel(\n project: Pick<WorkspaceUserProject, \"id\" | \"label\" | \"path\">\n): string {\n const label = stripAbsolutePathFromWorkspaceUserProjectLabel(project.label);\n if (label) {\n return label;\n }\n return basenameWorkspaceUserProjectPath(project.path) || project.id;\n}\n\nexport function stripAbsolutePathFromWorkspaceUserProjectLabel(\n label: string\n): string {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) {\n return \"\";\n }\n const pathStart = findAbsolutePathStart(trimmedLabel);\n if (pathStart < 0) {\n return trimmedLabel;\n }\n if (pathStart === 0) {\n return basenameWorkspaceUserProjectPath(trimmedLabel);\n }\n return trimmedLabel\n .slice(0, pathStart)\n .replace(/[\\s/\\\\|:()[\\]{}-]+$/u, \"\")\n .trim();\n}\n\nexport function basenameWorkspaceUserProjectPath(path: string): string {\n const normalizedPath = path.trim().replace(/[\\\\/]+$/u, \"\");\n if (!normalizedPath) {\n return \"\";\n }\n const segments = normalizedPath.split(/[\\\\/]+/u);\n return segments[segments.length - 1] ?? \"\";\n}\n\nexport function getWorkspaceUserProjectErrorCode(\n error: unknown\n): WorkspaceUserProjectCreationErrorCode | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\") {\n return code;\n }\n\n return getWorkspaceUserProjectErrorCode((error as { cause?: unknown }).cause);\n}\n\nexport async function prepareWorkspaceUserProjectSelection(\n api: WorkspaceUserProjectApi,\n input: WorkspaceUserProjectSelectionPreparationInput\n): Promise<WorkspaceUserProjectSelectionPreparation> {\n if (api.prepareSelection) {\n return api.prepareSelection(input);\n }\n const response = await api.list();\n const projects = response.projects;\n const selectedPath = input.selectedPath?.trim() ?? \"\";\n const isSelectedPathMissing =\n input.projectLocked && selectedPath\n ? await checkWorkspaceUserProjectPathMissing(api, selectedPath)\n : false;\n\n if (\n !input.projectLocked &&\n selectedPath &&\n !projects.some((project) => project.path === selectedPath)\n ) {\n await api.rememberDefaultSelection?.({ path: null });\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"clear\",\n suppressedPath: selectedPath\n }\n };\n }\n\n if (input.projectLocked || selectedPath) {\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n }\n\n const defaultSelection = await api.getDefaultSelection?.();\n const defaultPath = defaultSelection?.path?.trim() ?? \"\";\n if (defaultPath && projects.some((project) => project.path === defaultPath)) {\n return {\n isSelectedPathMissing,\n projects,\n selection: {\n kind: \"select\",\n path: defaultPath\n }\n };\n }\n return {\n isSelectedPathMissing,\n projects,\n selection: { kind: \"none\" }\n };\n}\n\nexport async function checkWorkspaceUserProjectPathMissing(\n api: Pick<WorkspaceUserProjectApi, \"checkPath\">,\n path: string\n): Promise<boolean> {\n try {\n const result = await api.checkPath?.({ path });\n return result ? !result.exists || !result.isDirectory : false;\n } catch {\n return false;\n }\n}\n\nfunction findAbsolutePathStart(value: string): number {\n const indexes = [\n value.search(/\\/[^\\s/]/u),\n value.search(/[A-Za-z]:[\\\\/]/u),\n value.search(/\\\\\\\\[^\\s\\\\]/u),\n value.search(/~[\\\\/]/u)\n ].filter((index) => index >= 0);\n return indexes.length > 0 ? Math.min(...indexes) : -1;\n}\n"],"mappings":"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","names":[]}
|