Skip to content

Commit 9711e73

Browse files
Merge pull request #313 from lightningrodlabs/redundant-logic
refactors to move project related logic into files
2 parents 18a2b12 + bda77eb commit 9711e73

File tree

13 files changed

+367
-281
lines changed

13 files changed

+367
-281
lines changed

web/src/components/JoinProjectModal/JoinProjectModal.js renamed to web/src/components/JoinProjectModal/JoinProjectModal.tsx

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -39,48 +39,41 @@ function JoinProjectForm({
3939
<ProjectModalHeading title="Join an existing project" />
4040
<ProjectModalSubHeading title="You will need to sync with a peer to get started" />
4141
<ProjectModalContentSpacer>
42-
<ProjectModalContent>
43-
<ValidatingFormInput
44-
value={projectSecret}
45-
onChange={onSecretChange}
46-
invalidInput={invalidText}
47-
errorText={invalidText}
48-
label="Project Invitation Secret"
49-
helpText="Paste the 5 word secret you received from the project host"
50-
/>
51-
</ProjectModalContent>
42+
<ProjectModalContent>
43+
{/* @ts-ignore */}
44+
<ValidatingFormInput
45+
value={projectSecret}
46+
onChange={onSecretChange}
47+
invalidInput={invalidText}
48+
errorText={invalidText}
49+
label="Project Invitation Secret"
50+
helpText="Paste the 5 word secret you received from the project host"
51+
/>
52+
</ProjectModalContent>
5253
</ProjectModalContentSpacer>
5354
<ProjectModalButton text={validateButtonContent} onClick={onValidate} />
5455
</div>
5556
)
5657
}
5758

58-
function ProjectJoinFollowUp({ onDone, peerFound, checkDone }) {
59+
function ProjectJoinFollowUp({ onDone, checkDone }) {
5960
return (
6061
<div
6162
className={`project-join-follow-up ${
6263
checkDone ? 'project-join-check-is-done' : ''
6364
}`}
6465
>
6566
<div>
66-
<ProjectModalHeading
67-
title={
68-
peerFound
69-
? 'Project joined successfully'
70-
: 'Project has been queued for syncing'
71-
}
72-
/>
73-
{!peerFound && (
67+
<ProjectModalHeading title="Project has been queued for syncing" />
7468
<ProjectModalSubHeading title="In order to join this project, you and a peer must simultaneously open the app." />
75-
)}
7669
</div>
77-
<ProjectModalContent>
78-
<div className="project-join-follow-up-content-wrapper">
79-
{peerFound
80-
? 'Peers in this project were found so now you will get synced with them.'
81-
: `If a peer is found, you are likely to be able to immediately begin to access the project, although a short sync period in the queue may be required before you can access it.`}
82-
</div>
83-
</ProjectModalContent>
70+
<ProjectModalContent>
71+
<div className="project-join-follow-up-content-wrapper">
72+
If a peer is found, you are likely to be able to immediately begin to
73+
access the project, although a short sync period in the queue may be
74+
required before you can access it.
75+
</div>
76+
</ProjectModalContent>
8477
<ProjectModalButton text="I understand" onClick={onDone} />
8578
</div>
8679
)
@@ -95,7 +88,6 @@ export default function JoinProjectModal({
9588
setProjectSecret('')
9689
setValidatingSecret(false)
9790
setInvalidText('')
98-
setPeerFound(false)
9991
setCheckDone(false)
10092
}
10193
const onValidate = async () => {
@@ -105,12 +97,12 @@ export default function JoinProjectModal({
10597
}
10698
setValidatingSecret(true)
10799
try {
108-
const peerWasFound = await onJoinProject(projectSecret)
109-
setPeerFound(peerWasFound)
100+
await onJoinProject(projectSecret)
110101
setCheckDone(true)
111102
setValidatingSecret(false)
112103
} catch (e) {
113104
console.log(e)
105+
// TODO: add better detail here
114106
setInvalidText('There was an error while joining project: ' + e.message)
115107
}
116108
}
@@ -120,7 +112,6 @@ export default function JoinProjectModal({
120112
}
121113

122114
const [checkDone, setCheckDone] = useState(false)
123-
const [peerFound, setPeerFound] = useState(true)
124115
const [projectSecret, setProjectSecret] = useState('')
125116
const [invalidText, setInvalidText] = useState('')
126117

@@ -132,7 +123,10 @@ export default function JoinProjectModal({
132123
setProjectSecret(val)
133124
if (!val) {
134125
setInvalidText('')
135-
} else if (val.split(' ').length !== 5 || !val.split(' ').every(word => word.length)) {
126+
} else if (
127+
val.split(' ').length !== 5 ||
128+
!val.split(' ').every((word) => word.length)
129+
) {
136130
setInvalidText('Secret must be 5 words.')
137131
}
138132
}
@@ -144,14 +138,9 @@ export default function JoinProjectModal({
144138
onClose={onDone}
145139
className="join-project-modal-wrapper"
146140
>
147-
<ProjectJoinFollowUp
148-
onDone={onDone}
149-
checkDone={checkDone}
150-
peerFound={peerFound}
151-
/>
141+
<ProjectJoinFollowUp onDone={onDone} checkDone={checkDone} />
152142
<JoinProjectForm
153143
checkDone={checkDone}
154-
peerFound={peerFound}
155144
projectSecret={projectSecret}
156145
onSecretChange={onSecretChange}
157146
invalidText={invalidText}

web/src/components/PendingProjects/PendingProjects.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ function PendingProjects({
1717
pendingProjects,
1818
fetchProjectMeta,
1919
setPendingProjects,
20-
deactivateApp,
20+
deactivateProject,
2121
}: {
2222
pendingProjects: string[]
2323
fetchProjectMeta: any
2424
setPendingProjects: React.Dispatch<React.SetStateAction<string[]>>
25-
deactivateApp: (appId: string, cellId: string) => Promise<void>
25+
deactivateProject: (appId: string, cellId: string) => Promise<void>
2626
}) {
2727
const [expanded, setExpanded] = useState(false)
2828
const [passphrases, setPassphrases] = useState<AppInfoStore>({})
@@ -77,7 +77,7 @@ function PendingProjects({
7777
}, [JSON.stringify(pendingProjects)])
7878

7979
const cancelProjectJoin = async (appId: string, cellId: string) => {
80-
await deactivateApp(appId, cellId)
80+
await deactivateProject(appId, cellId)
8181
// remove this project from pendingProjects
8282
setPendingProjects((pendingProjects: string[]) => {
8383
return pendingProjects.filter((c) => c !== cellId)

web/src/migrating/import/import.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,18 @@ import { cellIdFromString } from '../../utils'
33
import { RootState } from '../../redux/reducer'
44
import { AllProjectsDataExport } from '../export'
55
import { createWhoami } from '../../redux/persistent/profiles/who-am-i/actions'
6-
import { installProjectApp } from '../../projects/installProjectApp'
6+
import { installProject } from '../../projects/installProject'
77
import { joinProjectCellId } from '../../redux/persistent/cells/actions'
8-
import { createProfilesZomeApi, createProjectsZomeApi } from './zomeApiCreators'
9-
import { installProjectAppAndImport } from './installProjectAppAndImport'
8+
import { createProfilesZomeApi } from './zomeApiCreators'
9+
import { installProjectAndImport } from './installProjectAndImport'
1010
import ProfilesZomeApi from '../../api/profilesApi'
11-
import ProjectsZomeApi from '../../api/projectsApi'
11+
import { internalJoinProject } from '../../projects/joinProject'
1212

1313
export async function internalImportProjectsData(
1414
// dependencies
1515
profilesZomeApi: ProfilesZomeApi,
16-
projectsZomeApi: ProjectsZomeApi,
17-
_installProjectAppAndImport: typeof installProjectAppAndImport,
18-
_installProjectApp: typeof installProjectApp,
16+
_installProjectAndImport: typeof installProjectAndImport,
17+
_installProject: typeof installProject,
1918
store: any,
2019
// main input data and callbacks
2120
migrationData: string,
@@ -60,12 +59,11 @@ export async function internalImportProjectsData(
6059
// one completes
6160
for await (let projectData of projectsToMigrate) {
6261
const passphrase = projectData.projectMeta.passphrase
63-
await _installProjectAppAndImport(
62+
await _installProjectAndImport(
6463
myAgentPubKey,
6564
projectData,
6665
passphrase,
6766
store.dispatch,
68-
projectsZomeApi
6967
)
7068
stepsSoFar++
7169
onStep(stepsSoFar, totalSteps)
@@ -74,8 +72,7 @@ export async function internalImportProjectsData(
7472
// join each project that has already been migrated by a peer
7573
for await (let projectData of migratedProjectsToJoin) {
7674
const passphrase = projectData.projectMeta.passphrase
77-
const [cellIdString, _, __] = await _installProjectApp(passphrase)
78-
store.dispatch(joinProjectCellId(cellIdString))
75+
await internalJoinProject(passphrase, store.dispatch, _installProject)
7976
stepsSoFar++
8077
onStep(stepsSoFar, totalSteps)
8178
}
@@ -88,12 +85,10 @@ export default async function importProjectsData(
8885
) {
8986
const appWebsocket = await getAppWs()
9087
const profilesZomeApi = createProfilesZomeApi(appWebsocket)
91-
const projectsZomeApi = createProjectsZomeApi(appWebsocket)
9288
return internalImportProjectsData(
9389
profilesZomeApi,
94-
projectsZomeApi,
95-
installProjectAppAndImport,
96-
installProjectApp,
90+
installProjectAndImport,
91+
installProject,
9792
store,
9893
migrationData,
9994
onStep
Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
11
import ProjectsZomeApi from '../../api/projectsApi'
2-
import { installProjectApp } from '../../projects/installProjectApp'
3-
import { setMember } from '../../redux/persistent/projects/members/actions'
4-
import { simpleCreateProjectMeta } from '../../redux/persistent/projects/project-meta/actions'
2+
import { finalizeCreateProject } from '../../projects/createProject'
3+
import { getAppWs } from '../../hcWebsockets'
4+
import { installProject } from '../../projects/installProject'
55
import { AgentPubKeyB64 } from '../../types/shared'
6-
import { cellIdFromString } from '../../utils'
76
import { ProjectExportDataV1 } from '../export'
87
import { cloneProjectMeta } from './cloneFunctions'
98
import { createActionHashMapAndImportProjectData } from './createActionHashMapAndImportProjectData'
109

11-
export async function internalInstallProjectAppAndImport(
10+
export async function internalInstallProjectAndImport(
1211
agentAddress: AgentPubKeyB64,
1312
projectData: ProjectExportDataV1,
1413
passphrase: string,
1514
dispatch: any,
16-
_installProjectApp: typeof installProjectApp,
17-
_importProjectData: typeof createActionHashMapAndImportProjectData,
15+
iInstallProject: typeof installProject,
16+
iCreateActionHashMapAndImportProjectData: typeof createActionHashMapAndImportProjectData,
17+
iFinalizeCreateProject: typeof finalizeCreateProject,
1818
projectsZomeApi: ProjectsZomeApi
1919
) {
2020

2121
// first step is to install the dna
22-
const [projectsCellIdString] = await _installProjectApp(passphrase)
23-
const cellId = cellIdFromString(projectsCellIdString)
22+
const [cellIdString] = await iInstallProject(passphrase)
2423

2524
// next step is to import the bulk of the data into that project
26-
const oldToNewAddressMaps = await _importProjectData(
25+
const oldToNewAddressMaps = await iCreateActionHashMapAndImportProjectData(
2726
projectData,
28-
projectsCellIdString,
27+
cellIdString,
2928
dispatch
3029
)
3130

@@ -39,32 +38,31 @@ export async function internalInstallProjectAppAndImport(
3938
passphrase
4039
)(projectData.projectMeta)
4140
delete projectMeta.actionHash
42-
const simpleCreatedProjectMeta = await projectsZomeApi.projectMeta.simpleCreateProjectMeta(
43-
cellId,
44-
projectMeta
45-
)
46-
dispatch(
47-
simpleCreateProjectMeta(projectsCellIdString, simpleCreatedProjectMeta)
41+
await iFinalizeCreateProject(
42+
cellIdString,
43+
projectMeta,
44+
agentAddress,
45+
dispatch,
46+
projectsZomeApi
4847
)
49-
// this registers the agent to redux as a member of the project
50-
dispatch(setMember(projectsCellIdString, { agentPubKey: agentAddress }))
51-
5248
}
5349

54-
export async function installProjectAppAndImport(
50+
export async function installProjectAndImport(
5551
agentAddress: AgentPubKeyB64,
5652
projectData: ProjectExportDataV1,
5753
passphrase: string,
5854
dispatch: any,
59-
projectsZomeApi: ProjectsZomeApi
6055
) {
61-
internalInstallProjectAppAndImport(
56+
const appWebsocket = await getAppWs()
57+
const projectsZomeApi = new ProjectsZomeApi(appWebsocket)
58+
return internalInstallProjectAndImport(
6259
agentAddress,
6360
projectData,
6461
passphrase,
6562
dispatch,
66-
installProjectApp,
63+
installProject,
6764
createActionHashMapAndImportProjectData,
65+
finalizeCreateProject,
6866
projectsZomeApi
6967
)
7068
}

web/src/projects/createProject.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { AgentPubKeyB64 } from '@holochain/client'
2+
import ProjectsZomeApi from '../api/projectsApi'
3+
import { setMember } from '../redux/persistent/projects/members/actions'
4+
import { simpleCreateProjectMeta } from '../redux/persistent/projects/project-meta/actions'
5+
import { ProjectMeta } from '../types'
6+
import { cellIdFromString } from '../utils'
7+
import { installProject } from './installProject'
8+
import { CellIdString } from '../types/shared'
9+
10+
export async function finalizeCreateProject(
11+
cellIdString: CellIdString,
12+
projectMeta: ProjectMeta,
13+
agentAddress: AgentPubKeyB64,
14+
dispatch: any,
15+
projectsZomeApi: ProjectsZomeApi
16+
) {
17+
const cellId = cellIdFromString(cellIdString)
18+
const createdProjectMeta = await projectsZomeApi.projectMeta.simpleCreateProjectMeta(
19+
cellId,
20+
projectMeta
21+
)
22+
dispatch(simpleCreateProjectMeta(cellIdString, createdProjectMeta))
23+
// because we are acting optimistically,
24+
// we will directly set ourselves as a member of this cell
25+
dispatch(setMember(cellIdString, { agentPubKey: agentAddress }))
26+
}
27+
28+
export async function internalCreateProject(
29+
passphrase: string,
30+
projectMeta: ProjectMeta,
31+
agentAddress: AgentPubKeyB64,
32+
dispatch: any,
33+
iInstallProject: typeof installProject,
34+
projectsZomeApi: ProjectsZomeApi
35+
) {
36+
const startTime = Date.now()
37+
const [cellIdString] = await iInstallProject(passphrase)
38+
await finalizeCreateProject(
39+
cellIdString,
40+
projectMeta,
41+
agentAddress,
42+
dispatch,
43+
projectsZomeApi
44+
)
45+
const endTime = Date.now()
46+
console.log('duration in MS over createProject ', endTime - startTime)
47+
return cellIdString
48+
}
49+
50+
export async function createProject(
51+
passphrase: string,
52+
projectMeta: ProjectMeta,
53+
agentAddress: AgentPubKeyB64,
54+
dispatch: any,
55+
projectsZomeApi: ProjectsZomeApi
56+
) {
57+
return internalCreateProject(
58+
passphrase,
59+
projectMeta,
60+
agentAddress,
61+
dispatch,
62+
installProject,
63+
projectsZomeApi
64+
)
65+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { AdminWebsocket } from '@holochain/client'
2+
import { removeProjectCellId } from '../redux/persistent/cells/actions'
3+
import { CellIdString } from '../types/shared'
4+
5+
export async function deactivateProject(
6+
appId: string,
7+
cellId: CellIdString,
8+
dispatch: any,
9+
adminWs: AdminWebsocket
10+
) {
11+
// deactivate it in holochain
12+
await adminWs.disableApp({
13+
installed_app_id: appId,
14+
})
15+
// remove it from our redux state
16+
dispatch(removeProjectCellId(cellId))
17+
}

0 commit comments

Comments
 (0)