import React from 'dom-chef';
import select from 'select-dom';
import onetime from 'onetime';
import elementReady from 'element-ready';
import features from '../libs/features';
import {isUserProfile, isOwnOrganizationProfile, isOrganizationProfile} from '../libs/page-detect';
const addNewProjectLink = onetime(() => {
if (isUserProfile()) {
// The link already exists on our profile,
// and we can't create projects on others' profiles
return;
}
if (isOrganizationProfile() && !isOwnOrganizationProfile()) {
// We can only add projects to our organizations
return;
}
// We can't detect whether we can create projects on a repo,
// so we're just gonna show a potentially-404 link. 🤷
// URLs patterns:
// https://github.com/orgs/USER/projects/new
// https://github.com/USER/REPO/projects/new
const path = location.pathname.split('/', 3);
const base = path.length > 2 ? path.join('/') : '/orgs' + path.join('/');
select('.Header [href="/new"]')!.parentElement!.append(
New project
);
});
async function init(): Promise {
await elementReady(`
.orghead + *,
.repohead + *,
.user-profile-nav + *
`); // Wait for the tab bar to be loaded
const projectsTab = select([
'[data-hotkey="g b"]', // In organizations and repos
'.user-profile-nav [href$="?tab=projects"]' // In user profiles
].join());
if (!projectsTab) {
// Projects aren't enabled here
return;
}
addNewProjectLink();
// If there's a settings tab, the current user can disable the projects,
// so the tab should not be hidden
if (select.exists([
'.js-repo-nav [data-selected-links^="repo_settings"]', // In repos
'.pagehead-tabs-item[href$="/settings/profile"]' // In organizations
].join())) {
return;
}
// Only remove the tab if it's not the current page and if it has 0 projects
if (!projectsTab.matches('.selected') && select('.Counter', projectsTab)!.textContent!.trim() === '0') {
projectsTab.remove();
}
}
features.add({
id: __featureName__,
description: 'Hides the `Projects` tab from repositories and profiles when it’s empty. New projects can still be created via the `Create new…` menu.',
screenshot: 'https://user-images.githubusercontent.com/1402241/34909214-18b6fb2e-f8cf-11e7-8556-bed748596d3b.png',
include: [
features.isRepo,
features.isUserProfile,
features.isOrganizationProfile
],
load: features.onAjaxedPages,
init
});