Skip to content

Commit f0c80df

Browse files
committed
Merge branch 'dev'
2 parents 027a002 + dfd4852 commit f0c80df

File tree

5 files changed

+103
-25
lines changed

5 files changed

+103
-25
lines changed

common_library/src/constants/RendererEvents.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,5 +280,6 @@ export class RendererEvents{
280280
static readonly updateUserEmail = "updateUserEmail";
281281
static readonly getGraphCommits = "getGraphCommits";
282282
static readonly continueRebase = "continueRebase";
283+
static readonly remote = "remote";
283284
}
284285

src/businessClasses/GitManager.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export class GitManager{
4141
this.addMergeHandler();
4242
this.addCleanhHandler();
4343
this.addRemoteAddHandler();
44+
this.addRemoteHandler();
4445
this.addRemoteRemoveHandler();
4546
this.addRemoteListHandler();
4647
this.addRebaseHandler();
@@ -704,6 +705,14 @@ export class GitManager{
704705
})
705706
}
706707

708+
private addRemoteHandler(){
709+
ipcMain.handle(RendererEvents.remote,async (e,repoPath:string,options:string[])=>{
710+
const git = this.getGitRunner(repoPath);
711+
const r = await git.remote(options);
712+
return r;
713+
})
714+
}
715+
707716
private addRemoteRemoveHandler(){
708717
ipcMain.handle(RendererEvents.gitRemoveRemote,async (e,repoInfo:RepositoryInfo,remoteName:string)=>{
709718
await this.removeRemote(repoInfo, remoteName);
@@ -726,6 +735,12 @@ export class GitManager{
726735
await git.addRemote(remote.name,remote.url);
727736
}
728737

738+
private async updateRemote(repPath:string,name:string, url:string){
739+
const git = this.getGitRunner(repPath);
740+
const options = ["set-url",name,url];
741+
await git.remote(options);
742+
}
743+
729744
private async removeRemote(repoInfo:RepositoryInfo, remoteName:string){
730745
const git = this.getGitRunner(repoInfo);
731746
await git.removeRemote(remoteName);

ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
},
3535
"scripts": {
3636
"start": "set FAST_REFRESH=false && set NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
37-
"start-mac": "export FAST_REFRESH=false && export NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
37+
"start-mac": "export FAST_REFRESH=false && export NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
3838
"build": "react-scripts build",
3939
"test": "react-scripts test",
4040
"eject": "react-scripts eject"

ui/src/components/selectedRepository/selectedRepoRight/configs/remotes/RemoteList.tsx

Lines changed: 83 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,83 @@ import { useSelectorTyped } from "../../../../../store/rootReducer";
33
import { shallowEqual, useDispatch } from "react-redux";
44
import { AddRemote } from "./AddRemote";
55
import { ActionUI } from "../../../../../store/slices/UiSlice";
6-
import { FaTrash } from "react-icons/fa";
6+
import { FaPen, FaTrash } from "react-icons/fa";
77
import { IRemoteInfo } from "common_library";
88
import { IpcUtils } from "../../../../../lib/utils/IpcUtils";
99
import { ModalData } from "../../../../modals/ModalData";
1010
import { ActionModals } from "../../../../../store";
11-
import { EnumModals } from "../../../../../lib";
11+
import { EnumModals, useMultiState } from "../../../../../lib";
12+
import { Form } from "react-bootstrap";
13+
import { AppButton } from "../../../../common";
14+
15+
interface ISingleRemoteProps{
16+
url:string;
17+
name:string;
18+
handleRemove:()=>void;
19+
onUpdate:(url:string)=>void;
20+
21+
}
22+
23+
interface ISingleRemoteState{
24+
isEditing:boolean;
25+
value:string;
26+
}
27+
28+
function SingleRemote(props:ISingleRemoteProps){
29+
const [state,setState] = useMultiState<ISingleRemoteState>({isEditing:false,value:props.url});
30+
const dispatch = useDispatch();
31+
const handleSave = ()=>{
32+
setState({isEditing:false});
33+
props.onUpdate(state.value);
34+
}
35+
36+
const handleCancel = ()=>{
37+
setState({isEditing:false,value:props.url});
38+
}
39+
40+
const handleRemove=()=>{
41+
const yesHandler = ()=>{
42+
props.handleRemove();
43+
}
44+
ModalData.confirmationModal.YesHandler = yesHandler;
45+
ModalData.confirmationModal.message = "Remove remote '"+props.name+"' ?";
46+
dispatch(ActionModals.showModal(EnumModals.CONFIRMATION));
47+
}
48+
49+
useEffect(()=>{
50+
setState({value:props.url});
51+
},[props.url]);
52+
53+
return <div className="d-flex border w-100 align-items-center">
54+
<div className="flex-grow-1">
55+
<div className="d-flex">
56+
<b className="">{props.name}</b>
57+
</div>
58+
<div>
59+
{!state.isEditing && <span>{props.url}</span>}
60+
{state.isEditing &&
61+
<div className="d-flex align-items-center pt-1">
62+
<Form.Control type="text" value={state.value} onChange={e=> setState({value:e.target.value})} />
63+
64+
<div className="px-2 d-flex align-items-center">
65+
<span className="pe-3">
66+
<AppButton text="Save" className="text-primary" onClick={()=> handleSave()}/>
67+
</span>
68+
<AppButton text="Cancel" className="text-danger hover-brighter" title="Remove" onClick={_=> handleCancel()} />
69+
</div>
70+
</div>
71+
}
72+
</div>
73+
</div>
74+
{!state.isEditing && <div className="px-2">
75+
<span className="pe-3">
76+
<FaPen className="text-primary" onClick={()=> setState({isEditing:true})}/>
77+
</span>
78+
<FaTrash className="text-danger hover-brighter" title="Remove" onClick={_=> handleRemove()} />
79+
</div>}
80+
81+
</div>
82+
}
1283

1384
function RemoteListComponent(){
1485
const store = useSelectorTyped(state=>({
@@ -22,15 +93,15 @@ function RemoteListComponent(){
2293
},[])
2394

2495
const handleRemove = (remote:IRemoteInfo)=>{
25-
const remoteHandler = ()=>{
26-
IpcUtils.removeRemote(remote.name).then(_=>{
27-
dispatch(ActionUI.increamentVersion("remoteList"));
28-
})
29-
}
30-
ModalData.confirmationModal.YesHandler = remoteHandler;
31-
ModalData.confirmationModal.message = "Remove remote '"+remote.name+"' ?";
32-
dispatch(ActionModals.showModal(EnumModals.CONFIRMATION));
96+
IpcUtils.removeRemote(remote.name).then(_=>{
97+
dispatch(ActionUI.increamentVersion("remoteList"));
98+
})
99+
}
33100

101+
const handleUpdate = (remote:IRemoteInfo, url:string)=>{
102+
IpcUtils.runRemote(["set-url",remote.name,url]).then(_=>{
103+
dispatch(ActionUI.increamentVersion("remoteList"));
104+
});
34105
}
35106

36107
return <div className="w-100 p-1">
@@ -39,20 +110,8 @@ function RemoteListComponent(){
39110
</div>
40111
{
41112
store.remotes.map(r=>(
42-
<div key={r.url+r.name} className="d-flex border w-100 align-items-center">
43-
<div className="flex-grow-1">
44-
<div className="d-flex">
45-
<b className="">{r.name}</b>
46-
</div>
47-
<div>
48-
<span>{r.url}</span>
49-
</div>
50-
</div>
51-
<div className="pe-2">
52-
<FaTrash className="text-danger hover-brighter" title="Remove" onClick={_=> handleRemove(r)} />
53-
</div>
54-
</div>
55-
113+
<SingleRemote key={r.url+r.name} handleRemove={()=> handleRemove(r)} name={r.name} url={r.url}
114+
onUpdate={(url)=> handleUpdate(r,url)} />
56115
))
57116
}
58117
</div>

ui/src/lib/utils/IpcUtils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { RepoUtils } from "./RepoUtils";
33
import { IpcResult } from "../interfaces/IpcResult";
44

55
export class IpcUtils{
6+
static runRemote(options:string[]) {
7+
return this.runGitCommand(RendererEvents.remote,[options]);
8+
}
69

710
static abortRebase() {
811
const options = ["--abort"];

0 commit comments

Comments
 (0)