async function selectWorkspaceFolder()

in source-control-sample/src/extension.ts [208:275]


async function selectWorkspaceFolder(context: vscode.ExtensionContext, fiddleId: string): Promise<vscode.WorkspaceFolder | undefined> {
	let selectedFolder: vscode.WorkspaceFolder | undefined;
	let workspaceFolderUri: vscode.Uri | undefined;
	let workspaceFolderIndex: number | undefined;
	let folderOpeningMode: FolderOpeningMode;

	const folderPicks: WorkspaceFolderPick[] = [newFolderPick];

	if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) {
		folderPicks.push(newWorkspaceFolderPick);

		for (const wf of vscode.workspace.workspaceFolders) {
			const content = await afs.readdir(wf.uri.fsPath);
			folderPicks.push(new ExistingWorkspaceFolderPick(wf, content));
		}
	}

	const selectedFolderPick: WorkspaceFolderPick =
		folderPicks.length === 1 ?
			folderPicks[0] :
			await vscode.window.showQuickPick(folderPicks, {
				canPickMany: false, ignoreFocusOut: true, placeHolder: 'Pick workspace folder to create files in.'
			});

	if (!selectedFolderPick) { return null; }

	if (selectedFolderPick instanceof ExistingWorkspaceFolderPick) {
		selectedFolder = selectedFolderPick.workspaceFolder;
		workspaceFolderIndex = selectedFolder.index;
		workspaceFolderUri = selectedFolder.uri;
	}

	// eslint-disable-next-line prefer-const
	folderOpeningMode = selectedFolderPick.folderOpeningMode;

	if (!workspaceFolderUri && !selectedFolder) {
		const folderUris = await vscode.window.showOpenDialog({ canSelectFolders: true, canSelectFiles: false, canSelectMany: false, openLabel: 'Select folder' });
		if (!folderUris) {
			return null;
		}

		workspaceFolderUri = folderUris[0];
		// was such workspace folder already open?
		workspaceFolderIndex = vscode.workspace.workspaceFolders && firstIndex(vscode.workspace.workspaceFolders, (folder1: any) => folder1.uri.toString() === workspaceFolderUri!.toString());
	}

	if (! await clearWorkspaceFolder(workspaceFolderUri)) { return null; }

	const fiddleConfiguration = parseFiddleId(fiddleId);

	// save folder configuration
	FiddleSourceControl.saveConfiguration(workspaceFolderUri, fiddleConfiguration);

	if (folderOpeningMode === FolderOpeningMode.AddToWorkspace || folderOpeningMode === undefined) {
		const workSpacesToReplace = typeof workspaceFolderIndex === 'number' && workspaceFolderIndex > -1 ? 1 : 0;
		if (workspaceFolderIndex === undefined || workspaceFolderIndex < 0) { workspaceFolderIndex = 0; }

		// replace or insert the workspace
		if (workspaceFolderUri) {
			vscode.workspace.updateWorkspaceFolders(workspaceFolderIndex, workSpacesToReplace, { uri: workspaceFolderUri });
		}
	}
	else if (folderOpeningMode === FolderOpeningMode.OpenFolder) {
		vscode.commands.executeCommand("vscode.openFolder", workspaceFolderUri);
	}

	return selectedFolder;
}