Skip to content

Commit

Permalink
Merge branch 'main' of github.com:Joystream/pioneer into main
Browse files Browse the repository at this point in the history
  • Loading branch information
nick-olizarenko committed Jul 28, 2021
2 parents 716f423 + befdcba commit bb86a18
Show file tree
Hide file tree
Showing 51 changed files with 873 additions and 143 deletions.
2 changes: 2 additions & 0 deletions packages/ui/dev/scripts/generateMocks.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import yargs from 'yargs'

import { eventsModule } from './generateEventMocks'
import { forumModule } from './generators/forum/generateForumMocks'
import { generateAllEvents } from './generators/generateEvents'
import { generateMembers } from './generators/generateMembers'
import { generateOpeningsAndUpcomingOpenings } from './generators/generateOpeningsAndUpcomingOpenings'
Expand Down Expand Up @@ -44,4 +45,5 @@ yargs(process.argv.slice(2))
.scriptName('')
.command(allModule)
.command(eventsModule)
.command(forumModule)
.demandCommand().argv
17 changes: 17 additions & 0 deletions packages/ui/dev/scripts/generators/forum/generateCategories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import faker from 'faker'

import { RawForumCategoryMock } from '@/mocks/data/seedForum'

import { randomFromRange } from '../utils'

export const generateCategories = (): RawForumCategoryMock[] => {
let nextId = 0

return [...new Array(5)].map(() => {
return {
id: String(nextId++),
title: faker.lorem.words(randomFromRange(3, 5)),
description: faker.lorem.paragraph(randomFromRange(2, 3)),
}
})
}
19 changes: 19 additions & 0 deletions packages/ui/dev/scripts/generators/forum/generateForumMocks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { saveFile } from '../../helpers/saveFile'

import { generateCategories } from './generateCategories'
import { generateForumThreads } from './generateForumThreads'

export const generateForum = () => {
const forumCategories = generateCategories()
const forumThreads = generateForumThreads(forumCategories)

const forumMocks = { forumCategories, forumThreads }

Object.entries(forumMocks).forEach(([fileName, contents]) => saveFile(fileName, contents))
}

export const forumModule = {
command: 'forum',
describe: 'Generate forum from other mocks',
handler: generateForum,
}
22 changes: 22 additions & 0 deletions packages/ui/dev/scripts/generators/forum/generateForumThreads.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import faker from 'faker'

import { RawForumCategoryMock, RawForumThreadMock } from '@/mocks/data/seedForum'

import { randomFromRange } from '../utils'

export const generateForumThreads = (forumCategories: Pick<RawForumCategoryMock, 'id'>[]): RawForumThreadMock[] => {
let nextId = 0

return forumCategories
.map(({ id }) => {
return [...new Array(randomFromRange(3, 10))].map(() => {
return {
id: String(nextId++),
categoryId: id,
isSticky: !(nextId % 5),
title: faker.lorem.words(randomFromRange(4, 8)),
}
})
})
.flatMap((a) => a)
}
2 changes: 1 addition & 1 deletion packages/ui/src/accounts/hooks/useBalance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Balances } from '../types'
export const useBalance = (address?: Address): Balances | null => {
const { api, connectionState } = useApi()

const balances = useObservable(address ? api.derive.balances.all(address) : undefined, [connectionState, address])
const balances = useObservable(address ? api?.derive.balances.all(address) : undefined, [connectionState, address])

if (balances === undefined) {
return null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,12 @@ export function TransferSignModal({ onClose, from, amount, to, service }: Props)
const fromAddress = from.address
const balanceFrom = useBalance(fromAddress)
const balanceTo = useBalance(toAddress)
const { api } = useApi()
const transaction = useMemo(() => api.tx?.balances?.transfer(toAddress, amount), [toAddress, amount])
const { api, connectionState } = useApi()
const transaction = useMemo(() => api?.tx?.balances?.transfer(toAddress, amount), [
toAddress,
amount,
connectionState,
])
const { paymentInfo, sign, isReady } = useSignAndSendTransaction({ transaction, signer: fromAddress, service })

return (
Expand Down
70 changes: 29 additions & 41 deletions packages/ui/src/app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import React, { ReactNode } from 'react'
import React from 'react'
import { Redirect, Route, Switch } from 'react-router-dom'

import { ConnectionStatus } from '@/common/components/ConnectionStatus'
import { Loading } from '@/common/components/Loading'
import { Page } from '@/common/components/page/Page'
import { useApi } from '@/common/hooks/useApi'
import { ProposalsRoutes } from '@/proposals/constants/routes'

import { ExtensionWarning } from './components/ExtensionWarning'
import { SideBar } from './components/SideBar'
import { GlobalModals } from './GlobalModals'
import { Forum } from './pages/Forum'
import { Members } from './pages/Members/Members'
import { MyAccounts } from './pages/Profile/MyAccounts'
import { MyMemberships } from './pages/Profile/MyMemberships'
Expand All @@ -29,45 +28,34 @@ import { Providers } from './Providers'

export const App = () => (
<Providers>
<WaitForAPI>
<Page>
<SideBar />
<Switch>
<Route exact path="/profile" component={MyAccounts} />
<Route exact path="/profile/memberships" component={MyMemberships} />
<Route exact path="/working-groups" component={WorkingGroups} />
<Route exact path="/working-groups/openings" component={WorkingGroupsOpenings} />
<Route exact path="/working-groups/my-applications" component={MyApplications} />
<Route exact path="/working-groups/my-roles" component={MyRoles} />
<Route exact path="/working-groups/my-roles/:id" component={MyRole} />
<Route exact path="/working-groups/:name" component={WorkingGroup} />
<Route exact path="/working-groups/openings/:id" component={WorkingGroupOpening} />
<Route exact path="/working-groups/upcoming-openings/:id" component={UpcomingOpening} />
<Route exact path={ProposalsRoutes.current} component={Proposals} />
<Route exact path={ProposalsRoutes.past} component={PastProposals} />
<Route exact path={ProposalsRoutes.myproposals} />
<Route exact path={`${ProposalsRoutes.preview}/:id/vote/:voteId`} component={ProposalPreview} />
<Route exact path={`${ProposalsRoutes.preview}/:id/post/:postId`} component={ProposalPreview} />
<Route exact path={`${ProposalsRoutes.preview}/:id`} component={ProposalPreview} />
<Route exact path="/members" component={Members} />
<Route exact path="/members/:id" component={Members} />
<Route exact path="/settings" component={Settings} />
<Redirect exact from="/" to="/profile" />
</Switch>
</Page>
<GlobalModals />
</WaitForAPI>
<Page>
<SideBar />
<Switch>
<Route exact path="/profile" component={MyAccounts} />
<Route exact path="/profile/memberships" component={MyMemberships} />
<Route exact path="/working-groups" component={WorkingGroups} />
<Route exact path="/working-groups/openings" component={WorkingGroupsOpenings} />
<Route exact path="/working-groups/my-applications" component={MyApplications} />
<Route exact path="/working-groups/my-roles" component={MyRoles} />
<Route exact path="/working-groups/my-roles/:id" component={MyRole} />
<Route exact path="/working-groups/:name" component={WorkingGroup} />
<Route exact path="/working-groups/openings/:id" component={WorkingGroupOpening} />
<Route exact path="/working-groups/upcoming-openings/:id" component={UpcomingOpening} />
<Route exact path={ProposalsRoutes.current} component={Proposals} />
<Route exact path={ProposalsRoutes.past} component={PastProposals} />
<Route exact path={ProposalsRoutes.myproposals} />
<Route exact path={`${ProposalsRoutes.preview}/:id/vote/:voteId`} component={ProposalPreview} />
<Route exact path={`${ProposalsRoutes.preview}/:id/post/:postId`} component={ProposalPreview} />
<Route exact path={`${ProposalsRoutes.preview}/:id`} component={ProposalPreview} />
<Route exact path="/members" component={Members} />
<Route exact path="/members/:id" component={Members} />
<Route exact path="/settings" component={Settings} />
<Route path="/forum" component={Forum} />
<Redirect exact from="/" to="/profile" />
</Switch>
</Page>
<GlobalModals />
<ConnectionStatus />
<ExtensionWarning />
</Providers>
)

export const WaitForAPI = ({ children }: { children: ReactNode }) => {
const { connectionState } = useApi()

if (connectionState === 'connecting') {
return <Loading text="Waiting for API initialization" />
}

return <>{children}</>
}
2 changes: 1 addition & 1 deletion packages/ui/src/app/components/SideBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const SideBar = () => {
</NavigationLink>
</NavigationLinksItem>
<NavigationLinksItem>
<NavigationLink to="lorem" disabled>
<NavigationLink to="/forum">
<ForumIcon />
Forum
</NavigationLink>
Expand Down
14 changes: 14 additions & 0 deletions packages/ui/src/app/components/WaitForAPI.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React, { ReactNode } from 'react'

import { Loading } from '@/common/components/Loading'
import { useApi } from '@/common/hooks/useApi'

export const WaitForAPI = ({ children }: { children: ReactNode }) => {
const { connectionState } = useApi()

if (connectionState === 'connecting') {
return <Loading text="Waiting for API initialization" />
}

return <>{children}</>
}
1 change: 1 addition & 0 deletions packages/ui/src/app/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './App'
export { WaitForAPI } from '@/app/components/WaitForAPI'
14 changes: 14 additions & 0 deletions packages/ui/src/app/pages/Forum/Forum.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React from 'react'
import { Route, Switch } from 'react-router-dom'

import { ForumCategories } from '@/app/pages/Forum/ForumCategories'
import { ForumCategory } from '@/app/pages/Forum/ForumCategory'

export const Forum = () => {
return (
<Switch>
<Route path="/forum" exact component={ForumCategories} />
<Route path="/forum/category/:id" exact component={ForumCategory} />
</Switch>
)
}
30 changes: 30 additions & 0 deletions packages/ui/src/app/pages/Forum/ForumCategories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import React from 'react'

import { PageLayout } from '@/app/components/PageLayout'
import { Loading } from '@/common/components/Loading'
import { RouterLink } from '@/common/components/RouterLink'
import { useForumCategories } from '@/forum/hooks/useForumCategories'

export const ForumCategories = () => {
const { isLoading, forumCategories } = useForumCategories()

return (
<PageLayout
header={<h2>Categories</h2>}
main={
<div>
{isLoading && <Loading />}
{!isLoading &&
forumCategories.length &&
forumCategories.map((category) => {
return (
<div key={category.id}>
{category.id} | <RouterLink to={`/forum/category/${category.id}`}> {category.title}</RouterLink>
</div>
)
})}
</div>
}
/>
)
}
32 changes: 32 additions & 0 deletions packages/ui/src/app/pages/Forum/ForumCategory.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React from 'react'
import { useParams } from 'react-router-dom'

import { PageLayout } from '@/app/components/PageLayout'
import { Loading } from '@/common/components/Loading'
import { useForumCategoryThreads } from '@/forum/hooks/useForumCategoryThreads'

export const ForumCategory = () => {
const { id } = useParams<{ id: string }>()

const { isLoading, threads } = useForumCategoryThreads(id)

return (
<PageLayout
header={<h2>Category</h2>}
main={
<div>
{isLoading && <Loading />}
{!isLoading &&
threads.length &&
threads.map((thread) => {
return (
<div key={thread.id}>
{thread.id} | {thread.isSticky ? '📌' : ''} {thread.title}
</div>
)
})}
</div>
}
/>
)
}
1 change: 1 addition & 0 deletions packages/ui/src/app/pages/Forum/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './Forum'
17 changes: 12 additions & 5 deletions packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useCallback, useRef } from 'react'
import React, { useCallback, useMemo, useRef } from 'react'
import { useParams } from 'react-router-dom'
import styled from 'styled-components'

Expand Down Expand Up @@ -28,13 +28,20 @@ import { ApplicationDetailsModalCall } from '@/working-groups/modals/Application
import { ModalTypes } from '@/working-groups/modals/ChangeAccountModal/constants'
import { LeaveRoleModalCall } from '@/working-groups/modals/LeaveRoleModal'

import { useMyMemberships } from '../../../../memberships/hooks/useMyMemberships'
import { useWorkerUnstakingPeriodEnd } from '../../../../working-groups/hooks/useWorkerUnstakingPeriodEnd'
import { getRoleWarning } from '../../../../working-groups/model/getRoleWarning'

export const MyRole = () => {
const { id } = useParams<{ id: string }>()

const { worker, isLoading } = useWorker(id)
const { members } = useMyMemberships()

const isOwn = useMemo(() => {
return !!members.find((member) => member.id === worker?.membership.id)
}, [members.length, worker?.id])

const isActive = worker && worker.status === 'WorkerStatusActive'
const isLeaving = worker && worker.status === 'WorkerStatusLeaving'

Expand Down Expand Up @@ -89,7 +96,7 @@ export const MyRole = () => {
<LinkButtonGhost size="medium" to={`/working-groups/openings/${worker?.openingId}`}>
Opening
</LinkButtonGhost>
{isActive && (
{isActive && isOwn && (
<ButtonGhost size="medium" onClick={showLeaveRoleModal}>
Leave this position
<Tooltip tooltipText="Lorem ipsum" tooltipTitle="Lorem ipsum">
Expand Down Expand Up @@ -130,7 +137,7 @@ export const MyRole = () => {
<RoleAccountHeader>
<Label>Role Account</Label>
<ButtonsGroup>
{isActive && (
{isActive && isOwn && (
<ButtonGhost size="small" onClick={onChangeRoleClick}>
Change Role Account
</ButtonGhost>
Expand All @@ -155,7 +162,7 @@ export const MyRole = () => {
<RoleAccountHeader>
<Label>Reward Account</Label>
<ButtonsGroup>
{isActive && (
{isActive && isOwn && (
<ButtonGhost size="small" onClick={onChangeRewardClick}>
Change Reward Account
</ButtonGhost>
Expand All @@ -168,7 +175,7 @@ export const MyRole = () => {
}
sidebar={
<SidePanel neighbor={sideNeighborRef}>
<ActivitiesBlock activities={activities} label="Role Activities" warning={warning} isOwn />
<ActivitiesBlock activities={activities} label="Role Activities" warning={warning} isOwn={isOwn} />
</SidePanel>
}
footer={
Expand Down
16 changes: 12 additions & 4 deletions packages/ui/src/app/pages/WorkingGroups/UpcomingOpening.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,18 @@ export const UpcomingOpening = () => {
</BadgeStatus>
</BadgesRow>
<Statistics>
<TokenValueStat title="Current budget" tooltipText="Lorem ipsum..." value={opening.budget} />
<DurationStatistics title="Opening Expected duration" value={opening.expectedEnding} />
<DurationStatistics title="Time to begin" value={opening.expectedStart} />
<DurationStatistics
title="Opening Expected duration"
value={opening.expectedEnding}
from={opening.expectedStart}
/>
<TokenValueStat title="Reward per 3600 blocks" value={opening.reward.payout} />
<NumericValueStat title="Hiring limit" value={opening.hiringLimit} />
{opening.hiringLimit ? (
<NumericValueStat title="Hiring limit" value={opening.hiringLimit} />
) : (
<TokenValueStat title="Minimal Stake" value={opening.stake} />
)}
</Statistics>
</RowGapBlock>
</PageHeader>
Expand All @@ -94,7 +102,7 @@ export const UpcomingOpening = () => {
}
footer={
<PageFooter>
<BlockTime block={opening.createdAtBlock} layout="row" dateLabel="Hired" />
<BlockTime block={opening.createdAtBlock} layout="row" dateLabel="Created" />
</PageFooter>
}
/>
Expand Down
Loading

0 comments on commit bb86a18

Please sign in to comment.