Merge pull request #5060 from ethereum/paginationforgit

Paginationforgit
pull/5132/head
bunsenstraat 3 months ago committed by GitHub
commit b87bfc70bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 62
      apps/remix-ide-e2e/src/tests/dgit_github.test.ts
  2. 4
      libs/remix-ui/git/src/components/buttons/sourcecontrolbuttons.tsx
  3. 12
      libs/remix-ui/git/src/components/gitui.tsx
  4. 2
      libs/remix-ui/git/src/components/navigation/branchedetails.tsx
  5. 2
      libs/remix-ui/git/src/components/navigation/loaderindicator.tsx
  6. 47
      libs/remix-ui/git/src/components/panels/branches.tsx
  7. 2
      libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx
  8. 2
      libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx
  9. 2
      libs/remix-ui/git/src/components/panels/clone.tsx
  10. 15
      libs/remix-ui/git/src/components/panels/commits.tsx
  11. 2
      libs/remix-ui/git/src/components/panels/commits/commitsummary.tsx
  12. 26
      libs/remix-ui/git/src/components/panels/remoteselect.tsx
  13. 23
      libs/remix-ui/git/src/lib/gitactions.ts
  14. 12
      libs/remix-ui/git/src/lib/listeners.ts
  15. 2
      libs/remix-ui/git/src/state/actions.ts
  16. 3
      libs/remix-ui/git/src/state/context.tsx
  17. 14
      libs/remix-ui/git/src/state/gitpayload.ts
  18. 11
      libs/remix-ui/git/src/state/gitreducer.tsx
  19. 15
      libs/remix-ui/git/src/types/index.ts

@ -310,4 +310,66 @@ module.exports = {
} }
}) })
}, },
// pagination test
'clone repo #group3': function (browser: NightwatchBrowser) {
browser.
clickLaunchIcon('dgit')
.waitForElementVisible('*[data-id="clone-url"]')
.setValue('*[data-id="clone-url"]', 'https://github.com/ethereum/awesome-remix')
.waitForElementVisible('*[data-id="clone-branch"]')
.setValue('*[data-id="clone-branch"]', 'master')
.waitForElementVisible('*[data-id="clone-btn"]')
.click('*[data-id="clone-btn"]')
.clickLaunchIcon('filePanel')
.waitForElementVisible('*[data-id="treeViewLitreeViewItemREADME.md"]')
},
'Update settings for git #group3': function (browser: NightwatchBrowser) {
browser.
clickLaunchIcon('dgit')
.setValue('*[data-id="githubToken"]', 'invalidtoken')
.setValue('*[data-id="gitubUsername"]', 'git')
.setValue('*[data-id="githubEmail"]', 'git@example.com')
.click('*[data-id="saveGitHubCredentials"]')
.modalFooterOKClick('github-credentials-error')
},
'check the commits panel for pagination #group3': function (browser: NightwatchBrowser) {
browser
.waitForElementVisible('*[data-id="commits-panel"]')
.click('*[data-id="commits-panel"]')
.elements('xpath', '//*[@data-id="commits-current-branch-master"]//*[@data-type="commit-summary"]', function (result) {
console.log('Number of commit-summary elements:', (result.value as any).length);
browser.assert.ok((result.value as any).length == 1)
})
},
'load more commits #group3': function (browser: NightwatchBrowser) {
browser
.waitForElementVisible('*[data-id="load-more-commits"]')
.click('*[data-id="load-more-commits"]')
.waitForElementVisible('*[data-id="loader-indicator"]')
.waitForElementNotPresent('*[data-id="loader-indicator"]')
.elements('xpath', '//*[@data-id="commits-current-branch-master"]//*[@data-type="commit-summary"]', function (result) {
console.log('Number of commit-summary elements:', (result.value as any).length);
browser.assert.ok((result.value as any).length > 2)
})
},
'load more branches from remote #group3': function (browser: NightwatchBrowser) {
browser
.click('*[data-id="branches-panel"]')
.waitForElementVisible({
selector: '//*[@data-id="branches-panel-content-remote-branches"]',
locateStrategy: 'xpath'
})
.elements('xpath', '//*[@data-id="branches-panel-content-remote-branches"]//*[@data-type="branches-branch"]', function (result) {
console.log('Number of branches elements:', (result.value as any).length);
browser.assert.ok((result.value as any).length == 1)
})
.waitForElementVisible('*[data-id="remote-sync-origin"]')
.click('*[data-id="remote-sync-origin"]')
.waitForElementVisible('*[data-id="loader-indicator"]')
.waitForElementNotPresent('*[data-id="loader-indicator"]')
.elements('xpath', '//*[@data-id="branches-panel-content-remote-branches"]//*[@data-type="branches-branch"]', function (result) {
console.log('Number of branches elements:', (result.value as any).length);
browser.assert.ok((result.value as any).length > 2)
})
}
} }

@ -4,7 +4,7 @@ import { CustomTooltip } from "@remix-ui/helper"
import React, { useEffect, useState } from "react" import React, { useEffect, useState } from "react"
import { FormattedMessage } from "react-intl" import { FormattedMessage } from "react-intl"
import { gitActionsContext } from "../../state/context" import { gitActionsContext } from "../../state/context"
import { branch, gitMatomoEventTypes, remote } from "../../types" import { branch, defaultGitState, gitMatomoEventTypes, remote } from "../../types"
import { gitPluginContext } from "../gitui" import { gitPluginContext } from "../gitui"
import GitUIButton from "./gituibutton" import GitUIButton from "./gituibutton"
import { syncStateContext } from "./sourceControlBase" import { syncStateContext } from "./sourceControlBase"
@ -54,7 +54,7 @@ export const SourceControlButtons = () => {
const refresh = async() => { const refresh = async() => {
await sendToMatomo(gitMatomoEventTypes.REFRESH) await sendToMatomo(gitMatomoEventTypes.REFRESH)
await actions.getFileStatusMatrix(null) await actions.getFileStatusMatrix(null)
await actions.gitlog() actions.setStateGitLogCount(defaultGitState.gitLogCount)
} }
const buttonsDisabled = () => { const buttonsDisabled = () => {

@ -1,5 +1,5 @@
import React, { useEffect, useReducer, useState } from 'react' import React, { useEffect, useReducer, useState, useContext } from 'react'
import { add, addall, checkout, checkoutfile, clone, commit, createBranch, remoteBranches, repositories, rm, getCommitChanges, diff, resolveRef, getBranchCommits, setUpstreamRemote, loadGitHubUserFromToken, getBranches, getRemotes, remoteCommits, saveGitHubCredentials, getGitHubCredentialsFromLocalStorage, fetch, pull, push, setDefaultRemote, addRemote, removeRemote, sendToGitLog, clearGitLog, getBranchDifferences, getFileStatusMatrix, init, showAlert, gitlog } from '../lib/gitactions' import { add, addall, checkout, checkoutfile, clone, commit, createBranch, remoteBranches, repositories, rm, getCommitChanges, diff, resolveRef, getBranchCommits, setUpstreamRemote, loadGitHubUserFromToken, getBranches, getRemotes, remoteCommits, saveGitHubCredentials, getGitHubCredentialsFromLocalStorage, fetch, pull, push, setDefaultRemote, addRemote, removeRemote, sendToGitLog, clearGitLog, getBranchDifferences, getFileStatusMatrix, init, showAlert, gitlog, setStateGitLogCount } from '../lib/gitactions'
import { loadFiles, setCallBacks } from '../lib/listeners' import { loadFiles, setCallBacks } from '../lib/listeners'
import { openDiff, openFile, saveToken, sendToMatomo, setModifiedDecorator, setPlugin, setUntrackedDecorator, statusChanged } from '../lib/pluginActions' import { openDiff, openFile, saveToken, sendToMatomo, setModifiedDecorator, setPlugin, setUntrackedDecorator, statusChanged } from '../lib/pluginActions'
import { gitActionsContext, pluginActionsContext } from '../state/context' import { gitActionsContext, pluginActionsContext } from '../state/context'
@ -70,6 +70,11 @@ export const GitUI = (props: IGitUi) => {
}, [appLoaded]) }, [appLoaded])
useEffect(() => {
if (!appLoaded) return
gitlog(gitState.gitLogCount)
}, [gitState.timestamp, gitState.gitLogCount])
useEffect(() => { useEffect(() => {
if (!appLoaded) return if (!appLoaded) return
async function checkconfig() { async function checkconfig() {
@ -155,7 +160,8 @@ export const GitUI = (props: IGitUi) => {
clearGitLog, clearGitLog,
getFileStatusMatrix, getFileStatusMatrix,
gitlog, gitlog,
init init,
setStateGitLogCount
} }
const pluginActionsProviderValue = { const pluginActionsProviderValue = {

@ -64,7 +64,7 @@ export const BrancheDetailsNavigation = (props: BrancheDetailsNavigationProps) =
return ( return (
<> <>
<div className="d-flex flex-row w-100 mb-2 mt-2"> <div className="d-flex flex-row w-100 mb-2 mt-2">
<div data-id={`branches-${context.currentBranch.name === branch.name ? 'current-' : ''}branch-${branch.name}`} onClick={() => handleClick()} role={'button'} className='pointer d-flex flex-row w-100 commit-navigation'> <div data-type='branches-branch' data-id={`branches-${context.currentBranch.name === branch.name ? 'current-' : ''}branch-${branch.name}`} onClick={() => handleClick()} role={'button'} className='pointer d-flex flex-row w-100 commit-navigation'>
{ {
activePanel === eventKey ? <FontAwesomeIcon className='' icon={faCaretDown}></FontAwesomeIcon> : <FontAwesomeIcon className='' icon={faCaretRight}></FontAwesomeIcon> activePanel === eventKey ? <FontAwesomeIcon className='' icon={faCaretDown}></FontAwesomeIcon> : <FontAwesomeIcon className='' icon={faCaretRight}></FontAwesomeIcon>
} }

@ -13,7 +13,7 @@ const LoaderIndicator = ({ type, isLoadingCondition }: LoaderIndicatorProps) =>
const isLoading = loading || isLoadingCondition const isLoading = loading || isLoadingCondition
if (!isLoading) return null if (!isLoading) return null
return ( return (
<i style={{ fontSize: 'x-small' }} className="ml-1 fas fa-spinner fa-spin fa-4x"></i> <i data-id='loader-indicator' style={{ fontSize: 'x-small' }} className="ml-1 fas fa-spinner fa-spin fa-4x"></i>
); );
}; };

@ -1,7 +1,6 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Alert } from "react-bootstrap";
import { gitActionsContext } from "../../state/context"; import { gitActionsContext } from "../../state/context";
import { remote } from "../../types"; import { branch, remote } from "../../types";
import GitUIButton from "../buttons/gituibutton"; import GitUIButton from "../buttons/gituibutton";
import { gitPluginContext } from "../gitui"; import { gitPluginContext } from "../gitui";
import { LocalBranchDetails } from "./branches/localbranchdetails"; import { LocalBranchDetails } from "./branches/localbranchdetails";
@ -9,38 +8,74 @@ import { RemoteBranchDetails } from "./branches/remotebranchedetails";
import { faSync } from "@fortawesome/free-solid-svg-icons"; import { faSync } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
const pageLength = 5;
export const Branches = () => { export const Branches = () => {
const context = React.useContext(gitPluginContext) const context = React.useContext(gitPluginContext)
const actions = React.useContext(gitActionsContext) const actions = React.useContext(gitActionsContext)
const [localBranchPage, setLocalBranchPage] = useState(1);
const [remoteBranchPage, setRemoteBranchPage] = useState(1);
const [newBranch, setNewBranch] = useState({ value: "" }); const [newBranch, setNewBranch] = useState({ value: "" });
const [localBranches, setLocalBranches] = useState<branch[]>([]);
const [remoteBranches, setRemoteBranches] = useState<branch[]>([]);
const [currentBranch, setCurrentBranch] = useState<branch | null>(null);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setNewBranch({ value: e.currentTarget.value }); setNewBranch({ value: e.currentTarget.value });
}; };
useEffect(() => {
if (context.branches) {
if (context.currentBranch && context.currentBranch.name !== '') {
setCurrentBranch(context.branches.filter((branch, index) => !branch.remote && branch.name === context.currentBranch.name)[0]);
setLocalBranches(context.branches.filter((branch, index) => !branch.remote && branch.name !== context.currentBranch.name));
} else {
setLocalBranches(context.branches.filter((branch, index) => !branch.remote));
}
if (context.upstream) {
setRemoteBranches(context.branches.filter((branch, index) => branch.remote && branch.remote.name === context.upstream.name));
} else {
setRemoteBranches([]);
}
} else {
setLocalBranches([]);
setRemoteBranches([]);
}
}, [context.branches, context.defaultRemote, context.upstream, context.currentBranch]);
return ( return (
<> <>
<div data-id='branches-panel-content' className="pt-2"> <div data-id='branches-panel-content' className="pt-2">
{context.branches && context.branches.length ? {context.branches && context.branches.length ?
<div> <div>
<div data-id='branches-panel-content-local-branches'> <div data-id='branches-panel-content-local-branches'>
<label className="text-uppercase">local branches</label> <label className="text-uppercase">local branches </label><div className="badge badge-info badge-pill ml-2">{localBranches.length}</div>
{context.branches && context.branches.filter((branch, index) => !branch.remote).map((branch, index) => { {currentBranch && <LocalBranchDetails branch={currentBranch}></LocalBranchDetails>}
{context.branches && localBranches.slice(0, localBranchPage * pageLength).map((branch, index) => {
return ( return (
<LocalBranchDetails key={index} branch={branch}></LocalBranchDetails> <LocalBranchDetails key={index} branch={branch}></LocalBranchDetails>
); );
})} })}
{context.branches && localBranches.length > localBranchPage * pageLength && <GitUIButton className="btn btn-sm" onClick={() => {
setLocalBranchPage(localBranchPage + 1)
}}>Show more</GitUIButton>}
</div> </div>
<hr /> <hr />
{context.upstream ? {context.upstream ?
<> <>
<div data-id='branches-panel-content-remote-branches'> <div data-id='branches-panel-content-remote-branches'>
<label className="text-uppercase">remote branches on {context.upstream ? context.upstream.name : null}</label> <label className="text-uppercase">remote branches on {context.upstream ? context.upstream.name : null}</label><div className="badge badge-info badge-pill ml-2">{remoteBranches.length}</div>
{context.branches && context.branches.filter((branch, index) => branch.remote && branch.remote.name === context.upstream.name).map((branch, index) => { {context.branches && remoteBranches
.slice(0, remoteBranchPage * pageLength)
.map((branch, index) => {
return ( return (
<RemoteBranchDetails allowCheckout={true} key={index} branch={branch}></RemoteBranchDetails> <RemoteBranchDetails allowCheckout={true} key={index} branch={branch}></RemoteBranchDetails>
); );
})} })}
{context.branches && remoteBranches.length > remoteBranchPage * pageLength && <><GitUIButton className="btn btn-sm" onClick={() => {
setRemoteBranchPage(remoteBranchPage + 1);
}}>Show more</GitUIButton><br></br></>}
<GitUIButton data-id={`remote-sync-${context.upstream.name}`} className="btn btn-sm" onClick={async () => { <GitUIButton data-id={`remote-sync-${context.upstream.name}`} className="btn btn-sm" onClick={async () => {
await actions.fetch({ await actions.fetch({
remote: context.upstream remote: context.upstream

@ -81,7 +81,7 @@ export const LocalBranchDetails = (props: BrancheDetailsProps) => {
})} })}
</div> </div>
</div> </div>
{hasNextPage && <GitUIButton className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>} {hasNextPage && <GitUIButton data-id='load-more-local-branches' className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>}
</> </>
</Accordion.Collapse> </Accordion.Collapse>
</Accordion>) </Accordion>)

@ -107,7 +107,7 @@ export const RemoteBranchDetails = (props: BrancheDetailsProps) => {
})} })}
</div> </div>
{hasNextPage && <GitUIButton className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>} {hasNextPage && <GitUIButton data-id='load-more-remote-branches' className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>}
</> </>
</Accordion.Collapse> </Accordion.Collapse>
</Accordion>) </Accordion>)

@ -78,7 +78,7 @@ export const Clone = (props: CloneProps) => {
<FormControl data-id="clone-url" id="cloneulr" placeholder="url" name='cloneurl' value={cloneUrl} onChange={e => onGitHubCloneUrlChange(e.target.value)} aria-describedby="urlprepend" /> <FormControl data-id="clone-url" id="cloneulr" placeholder="url" name='cloneurl' value={cloneUrl} onChange={e => onGitHubCloneUrlChange(e.target.value)} aria-describedby="urlprepend" />
</InputGroup> </InputGroup>
<input name='clonebranch' onChange={e => onCloneBranchChange(e.target.value)} value={cloneBranch} className="form-control mb-2 mt-2" placeholder="branch" type="text" id="clonebranch" /> <input name='clonebranch' data-id="clone-branch" onChange={e => onCloneBranchChange(e.target.value)} value={cloneBranch} className="form-control mb-2 mt-2" placeholder="branch" type="text" id="clonebranch" />
<GitUIButton disabledCondition={!cloneUrl} data-id='clone-btn' className='btn btn-primary mt-1 w-100' onClick={async () => { <GitUIButton disabledCondition={!cloneUrl} data-id='clone-btn' className='btn btn-primary mt-1 w-100' onClick={async () => {
clone() clone()
}}>clone</GitUIButton> }}>clone</GitUIButton>

@ -1,12 +1,10 @@
import { checkout, ReadCommitResult } from "isomorphic-git"; import { ReadCommitResult } from "isomorphic-git";
import React from "react"; import React from "react";
import { gitActionsContext } from "../../state/context"; import { gitActionsContext } from "../../state/context";
import GitUIButton from "../buttons/gituibutton"; import GitUIButton from "../buttons/gituibutton";
import { gitPluginContext } from "../gitui"; import { gitPluginContext } from "../gitui";
import LoaderIndicator from "../navigation/loaderindicator";
import { BranchDifferences } from "./branches/branchdifferences"; import { BranchDifferences } from "./branches/branchdifferences";
import { CommitDetails } from "./commits/commitdetails"; import { CommitDetails } from "./commits/commitdetails";
import { CommitSummary } from "./commits/commitsummary";
export const Commits = () => { export const Commits = () => {
const [hasNextPage, setHasNextPage] = React.useState(true) const [hasNextPage, setHasNextPage] = React.useState(true)
@ -21,15 +19,18 @@ export const Commits = () => {
} }
}; };
const loadNextPage = () => { const loadNextPage = async () => {
actions.fetch({
await actions.fetch({
remote: null, remote: null,
ref: context.currentBranch, ref: context.currentBranch,
relative: true, relative: true,
depth: 5, depth: 5,
singleBranch: true singleBranch: true,
quiet: true
}) })
await actions.setStateGitLogCount(context.gitLogCount + 5)
} }
const getRemote = () => { const getRemote = () => {
@ -56,7 +57,7 @@ export const Commits = () => {
})} })}
</div> </div>
</div> </div>
{hasNextPage && <GitUIButton disabledCondition={fetchIsDisabled()} className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>} {hasNextPage && <GitUIButton data-id='load-more-commits' disabledCondition={fetchIsDisabled()} className="mb-1 ml-2 btn btn-sm" onClick={loadNextPage}>Load more</GitUIButton>}
</> </>
: <div className="text-muted">No commits</div>} : <div className="text-muted">No commits</div>}
</> </>

@ -61,7 +61,7 @@ export const CommitSummary = (props: CommitSummaryProps) => {
return ( return (
<> <>
<div data-id={`commit-summary-${removeLineBreaks(commit.commit.message)}-${isAheadOfRepo ? 'ahead' : ''}`} className="long-and-truncated ml-2"> <div data-type='commit-summary' data-id={`commit-summary-${removeLineBreaks(commit.commit.message)}-${isAheadOfRepo ? 'ahead' : ''}`} className="long-and-truncated ml-2">
{commit.commit.message} {commit.commit.message}
</div> </div>
{commit.commit.author.name || ""} {commit.commit.author.name || ""}

@ -1,11 +1,10 @@
import { branch, checkout, ReadCommitResult } from "isomorphic-git";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { gitActionsContext } from "../../state/context"; import { gitActionsContext } from "../../state/context";
import { gitPluginContext } from "../gitui"; import { gitPluginContext } from "../gitui";
import { default as dateFormat } from "dateformat"; import { default as dateFormat } from "dateformat";
import { RemotesDetailsNavigation } from "../navigation/remotesdetails"; import { RemotesDetailsNavigation } from "../navigation/remotesdetails";
import { Accordion } from "react-bootstrap"; import { Accordion } from "react-bootstrap";
import { remote } from "../../types"; import { branch, remote } from "../../types";
import { RemoteBranchDetails } from "./branches/remotebranchedetails"; import { RemoteBranchDetails } from "./branches/remotebranchedetails";
import GitUIButton from "../buttons/gituibutton"; import GitUIButton from "../buttons/gituibutton";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -16,27 +15,48 @@ export interface RemoteSelectProps {
openDefault: boolean openDefault: boolean
} }
const pageLength = 5;
export const Remoteselect = (props: RemoteSelectProps) => { export const Remoteselect = (props: RemoteSelectProps) => {
const { remote, openDefault } = props; const { remote, openDefault } = props;
const context = React.useContext(gitPluginContext) const context = React.useContext(gitPluginContext)
const actions = React.useContext(gitActionsContext) const actions = React.useContext(gitActionsContext)
const [activePanel, setActivePanel] = useState<string>(""); const [activePanel, setActivePanel] = useState<string>("");
const [remoteBranchPage, setRemoteBranchPage] = useState(1);
const [remoteBranches, setRemoteBranches] = useState<branch[]>([]);
useEffect(() => { useEffect(() => {
setActivePanel(openDefault ? "0" : "") setActivePanel(openDefault ? "0" : "")
}, [openDefault]) }, [openDefault])
useEffect(() => {
if (context.branches) {
if (remote && remote.name) {
setRemoteBranches(context.branches.filter((branch, index) => branch.remote && branch.remote.name === remote.name))
} else {
setRemoteBranches([]);
}
} else {
setRemoteBranches([]);
}
}, [context.branches, context.defaultRemote, context.upstream, remote]);
return ( return (
<> <>
<Accordion activeKey={activePanel} defaultActiveKey=''> <Accordion activeKey={activePanel} defaultActiveKey=''>
<RemotesDetailsNavigation callback={setActivePanel} eventKey="0" activePanel={activePanel} remote={remote} /> <RemotesDetailsNavigation callback={setActivePanel} eventKey="0" activePanel={activePanel} remote={remote} />
<Accordion.Collapse className="pl-2 border-left ml-1" eventKey="0"> <Accordion.Collapse className="pl-2 border-left ml-1" eventKey="0">
<> <>
{context.branches && context.branches.filter((branch, index) => branch.remote && branch.remote.name === remote.name).map((branch, index) => { {context.branches && remoteBranches
.slice(0, remoteBranchPage * pageLength)
.map((branch, index) => {
return ( return (
<RemoteBranchDetails allowCheckout={false} key={index} branch={branch}></RemoteBranchDetails> <RemoteBranchDetails allowCheckout={false} key={index} branch={branch}></RemoteBranchDetails>
); );
})} })}
{context.branches && remoteBranches.length > remoteBranchPage * pageLength && <><GitUIButton className="btn btn-sm" onClick={() => {
setRemoteBranchPage(remoteBranchPage + 1);
}}>Show more</GitUIButton><br></br></>}
<GitUIButton data-id={`remote-sync-${remote.name}`} className="btn btn-sm" onClick={async () => { <GitUIButton data-id={`remote-sync-${remote.name}`} className="btn btn-sm" onClick={async () => {
await actions.fetch({ await actions.fetch({
remote remote

@ -1,6 +1,6 @@
import { ReadBlobResult, ReadCommitResult } from "isomorphic-git"; import { ReadBlobResult, ReadCommitResult } from "isomorphic-git";
import React from "react"; import React from "react";
import { fileStatus, fileStatusMerge, setRemoteBranchCommits, resetRemoteBranchCommits, setBranches, setCanCommit, setCommitChanges, setCommits, setCurrentBranch, setGitHubUser, setLoading, setRemoteBranches, setRemotes, setRepos, setUpstream, setLocalBranchCommits, setBranchDifferences, setRemoteAsDefault, setScopes, setLog, clearLog, setUserEmails, setCurrenHead, setStoragePayload, resetBranchDifferences } from "../state/gitpayload"; import { fileStatus, fileStatusMerge, setRemoteBranchCommits, resetRemoteBranchCommits, setBranches, setCanCommit, setCommitChanges, setCommits, setCurrentBranch, setGitHubUser, setLoading, setRemoteBranches, setRemotes, setRepos, setUpstream, setLocalBranchCommits, setBranchDifferences, setRemoteAsDefault, setScopes, setLog, clearLog, setUserEmails, setCurrenHead, setStoragePayload, resetBranchDifferences, setGitLogCount, setTimestamp } from "../state/gitpayload";
import { GitHubUser, branch, commitChange, gitActionDispatch, statusMatrixType, gitState, branchDifference, remote, gitLog, fileStatusResult, customGitApi, IGitApi, cloneInputType, fetchInputType, pullInputType, pushInputType, checkoutInput, rmInput, addInput, repository, userEmails, storage, gitMatomoEventTypes } from '../types'; import { GitHubUser, branch, commitChange, gitActionDispatch, statusMatrixType, gitState, branchDifference, remote, gitLog, fileStatusResult, customGitApi, IGitApi, cloneInputType, fetchInputType, pullInputType, pushInputType, checkoutInput, rmInput, addInput, repository, userEmails, storage, gitMatomoEventTypes } from '../types';
import { removeSlash } from "../utils"; import { removeSlash } from "../utils";
import { disableCallBacks, enableCallBacks } from "./listeners"; import { disableCallBacks, enableCallBacks } from "./listeners";
@ -41,7 +41,7 @@ export const setPlugin = (p: Plugin, dispatcher: React.Dispatch<gitActionDispatc
export const init = async () => { export const init = async () => {
await sendToMatomo(gitMatomoEventTypes.INIT) await sendToMatomo(gitMatomoEventTypes.INIT)
await plugin.call('dgitApi', "init"); await plugin.call('dgitApi', "init");
await gitlog(); dispatch(setTimestamp(Date.now()))
await getBranches(); await getBranches();
} }
@ -81,13 +81,13 @@ export const getFileStatusMatrix = async (filepaths: string[]) => {
dispatch(setLoading(false)) dispatch(setLoading(false))
} }
export const getCommits = async () => { export const getCommits = async (depth: number) => {
try { try {
const commits: ReadCommitResult[] = await plugin.call( const commits: ReadCommitResult[] = await plugin.call(
'dgitApi', 'dgitApi',
"log", "log",
{ ref: "HEAD" } { ref: "HEAD", depth: depth }
); );
return commits; return commits;
@ -96,11 +96,12 @@ export const getCommits = async () => {
} }
} }
export const gitlog = async () => { export const gitlog = async (depth: number) => {
console.log('gitlog start')
dispatch(setLoading(true)) dispatch(setLoading(true))
let commits = [] let commits = []
try { try {
commits = await getCommits() commits = await getCommits(depth)
} catch (e) { } catch (e) {
} }
dispatch(setCommits(commits)) dispatch(setCommits(commits))
@ -108,6 +109,10 @@ export const gitlog = async () => {
dispatch(setLoading(false)) dispatch(setLoading(false))
} }
export const setStateGitLogCount = async (count: number) => {
dispatch(setGitLogCount(count))
}
export const showCurrentBranch = async () => { export const showCurrentBranch = async () => {
try { try {
const branch = await currentBranch(); const branch = await currentBranch();
@ -342,7 +347,7 @@ export const fetch = async (input: fetchInputType) => {
try { try {
await plugin.call('dgitApi', 'fetch', input); await plugin.call('dgitApi', 'fetch', input);
if (!input.quiet) { if (!input.quiet) {
await gitlog() dispatch(setTimestamp(Date.now()))
await getBranches() await getBranches()
} }
} catch (e: any) { } catch (e: any) {
@ -359,7 +364,7 @@ export const pull = async (input: pullInputType) => {
await disableCallBacks() await disableCallBacks()
try { try {
await plugin.call('dgitApi', 'pull', input) await plugin.call('dgitApi', 'pull', input)
await gitlog() dispatch(setTimestamp(Date.now()))
} catch (e: any) { } catch (e: any) {
console.log(e) console.log(e)
await parseError(e) await parseError(e)
@ -393,6 +398,8 @@ const tokenWarning = async () => {
const parseError = async (e: any) => { const parseError = async (e: any) => {
console.trace(e) console.trace(e)
if (!e.message) return
// if message conttains 401 Unauthorized, show token warning // if message conttains 401 Unauthorized, show token warning
if (e.message.includes('401')) { if (e.message.includes('401')) {
await sendToMatomo(gitMatomoEventTypes.ERROR, ['401']) await sendToMatomo(gitMatomoEventTypes.ERROR, ['401'])

@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import { setCanUseApp, setLoading, setRepoName, setGItHubToken, setLog, setGitHubUser, setUserEmails } from "../state/gitpayload"; import { setCanUseApp, setLoading, setRepoName, setGItHubToken, setLog, setGitHubUser, setUserEmails, setTimestamp } from "../state/gitpayload";
import { gitActionDispatch, gitUIPanels, storage } from "../types"; import { gitActionDispatch, gitUIPanels, storage } from "../types";
import { Plugin } from "@remixproject/engine"; import { Plugin } from "@remixproject/engine";
import { getBranches, getFileStatusMatrix, loadGitHubUserFromToken, getRemotes, gitlog, setPlugin, setStorage } from "./gitactions"; import { getBranches, getFileStatusMatrix, loadGitHubUserFromToken, getRemotes, gitlog, setPlugin, setStorage } from "./gitactions";
@ -72,7 +72,7 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch<g
loadFiles() loadFiles()
}) })
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
gitlog() gitDispatch(setTimestamp(Date.now()))
}) })
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
getBranches() getBranches()
@ -84,7 +84,7 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch<g
plugin.on('dgitApi', 'checkout', async () => { plugin.on('dgitApi', 'checkout', async () => {
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
gitlog() gitDispatch(setTimestamp(Date.now()))
}) })
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
getBranches() getBranches()
@ -111,7 +111,7 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch<g
}) })
plugin.on('dgitApi', 'commit', async () => { plugin.on('dgitApi', 'commit', async () => {
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
gitlog() gitDispatch(setTimestamp(Date.now()))
}, 10) }, 10)
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
getBranches() getBranches()
@ -123,7 +123,7 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch<g
}) })
plugin.on('dgitApi', 'branch', async () => { plugin.on('dgitApi', 'branch', async () => {
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
gitlog() gitDispatch(setTimestamp(Date.now()))
}) })
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
getBranches() getBranches()
@ -145,7 +145,7 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch<g
getBranches() getBranches()
}) })
loadFileQueue.enqueue(async () => { loadFileQueue.enqueue(async () => {
gitlog() gitDispatch(setTimestamp(Date.now()))
}) })
}) })
plugin.on('manager', 'pluginActivated', async (p: Profile<any>) => { plugin.on('manager', 'pluginActivated', async (p: Profile<any>) => {

@ -44,6 +44,8 @@ export interface ActionPayloadTypes {
CLEAR_LOG: void CLEAR_LOG: void
SET_USER_EMAILS: userEmails SET_USER_EMAILS: userEmails
SET_STORAGE: storage SET_STORAGE: storage
SET_TIMESTAMP: number
SET_GIT_LOG_COUNT: number
} }
export interface Action<T extends keyof ActionPayloadTypes> { export interface Action<T extends keyof ActionPayloadTypes> {

@ -31,8 +31,9 @@ export interface gitActions {
sendToGitLog: (message: gitLog) => Promise<void> sendToGitLog: (message: gitLog) => Promise<void>
clearGitLog: () => Promise<void> clearGitLog: () => Promise<void>
getFileStatusMatrix(filespaths:[]): Promise<void> getFileStatusMatrix(filespaths:[]): Promise<void>
gitlog(): Promise<void> gitlog(depth: number): Promise<void>
init(): Promise<void> init(): Promise<void>
setStateGitLogCount(count: number): Promise<void>
} }
export const gitActionsContext = React.createContext<gitActions>(null) export const gitActionsContext = React.createContext<gitActions>(null)

@ -231,3 +231,17 @@ export const setStoragePayload = (storage: storage) => {
payload: storage payload: storage
} }
} }
export const setTimestamp = (timestamp: number) => {
return {
type: 'SET_TIMESTAMP',
payload: timestamp
}
}
export const setGitLogCount = (count: number) => {
return {
type: 'SET_GIT_LOG_COUNT',
payload: count
}
}

@ -215,6 +215,17 @@ export const gitReducer = (state: gitState = defaultGitState, action: Actions):
...state, ...state,
storage: action.payload storage: action.payload
} }
case 'SET_TIMESTAMP':
return {
...state,
timestamp: action.payload
}
case 'SET_GIT_LOG_COUNT':
return {
...state,
gitLogCount: action.payload
}
} }
} }

@ -21,7 +21,7 @@ export interface IGitApi {
clone(input: cloneInputType): Promise<any> clone(input: cloneInputType): Promise<any>
branches(input?: branchesInput): Promise<branch[]>, branches(input?: branchesInput): Promise<branch[]>,
remotes(): Promise<remote[]>, remotes(): Promise<remote[]>,
log(cmd: { ref: string }): Promise<ReadCommitResult[]>, log(cmd: { ref: string, depth?: number }): Promise<ReadCommitResult[]>,
remotecommits(input: remoteCommitsInputType): Promise<pagedCommits[]> remotecommits(input: remoteCommitsInputType): Promise<pagedCommits[]>
fetch(input: fetchInputType): Promise<any> fetch(input: fetchInputType): Promise<any>
pull(input: pullInputType): Promise<any> pull(input: pullInputType): Promise<any>
@ -185,6 +185,8 @@ export type gitState = {
gitHubScopes: string[] gitHubScopes: string[]
gitHubAccessToken: string gitHubAccessToken: string
log: gitLog[] log: gitLog[]
timestamp: number
gitLogCount: number
} }
export type gitLog = { export type gitLog = {
type: 'error' | 'warning' | 'info' | 'success', type: 'error' | 'warning' | 'info' | 'success',
@ -304,7 +306,9 @@ export const defaultGitState: gitState = {
userEmails: [] as userEmails, userEmails: [] as userEmails,
gitHubScopes: [], gitHubScopes: [],
gitHubAccessToken: "", gitHubAccessToken: "",
log: [] log: [],
timestamp: 0,
gitLogCount: 22
} }
export const defaultLoaderState: loaderState = { export const defaultLoaderState: loaderState = {
@ -494,4 +498,9 @@ export interface clearLogAction {
type: string type: string
} }
export type gitActionDispatch = setCurrentHeadAction | clearLogAction | setLogAction | setDefaultRemoteAction | setTokenAction | setUpstreamAction | setRemoteBranchCommitsAction | setLocalBranchCommitsAction | setBranchDifferencesAction | setRemotesAction | setCurrentBranchAction | fileStatusAction | setLoadingAction | setCanUseAppAction | setRepoNameAction | setCommitsAction | setBranchesAction | setReposAction | setRemoteBranchesAction export interface setTimeStampAction {
type: string,
payload: number
}
export type gitActionDispatch = setTimeStampAction | setCurrentHeadAction | clearLogAction | setLogAction | setDefaultRemoteAction | setTokenAction | setUpstreamAction | setRemoteBranchCommitsAction | setLocalBranchCommitsAction | setBranchDifferencesAction | setRemotesAction | setCurrentBranchAction | fileStatusAction | setLoadingAction | setCanUseAppAction | setRepoNameAction | setCommitsAction | setBranchesAction | setReposAction | setRemoteBranchesAction

Loading…
Cancel
Save