Append tags from market page
This commit is contained in:
parent
2e7a8210bb
commit
33c8fe2bc0
|
@ -21,7 +21,7 @@ service cloud.firestore {
|
||||||
|
|
||||||
match /contracts/{contractId} {
|
match /contracts/{contractId} {
|
||||||
allow read;
|
allow read;
|
||||||
allow update: if resource.data.creatorId == request.auth.uid && request.resource.data.diff(resource.data).affectedKeys()
|
allow update: if request.resource.data.diff(resource.data).affectedKeys()
|
||||||
.hasOnly(['description', 'tags', 'lowercaseTags']);
|
.hasOnly(['description', 'tags', 'lowercaseTags']);
|
||||||
allow delete: if resource.data.creatorId == request.auth.uid;
|
allow delete: if resource.data.creatorId == request.auth.uid;
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,13 +194,6 @@ export function ContractDetails(props: { contract: Contract }) {
|
||||||
<div className="">•</div>
|
<div className="">•</div>
|
||||||
<div className="whitespace-nowrap">{formatMoney(truePool)} pool</div>
|
<div className="whitespace-nowrap">{formatMoney(truePool)} pool</div>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
{tags.length > 0 && (
|
|
||||||
<>
|
|
||||||
<div className="hidden sm:block">•</div>
|
|
||||||
<CompactTagsList tags={tags} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Col>
|
</Col>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import { ContractFeed } from './contract-feed'
|
||||||
import { TweetButton } from './tweet-button'
|
import { TweetButton } from './tweet-button'
|
||||||
import { Bet } from '../../common/bet'
|
import { Bet } from '../../common/bet'
|
||||||
import { Comment } from '../../common/comment'
|
import { Comment } from '../../common/comment'
|
||||||
|
import { TagsInput } from './tags-input'
|
||||||
|
|
||||||
export const ContractOverview = (props: {
|
export const ContractOverview = (props: {
|
||||||
contract: Contract
|
contract: Contract
|
||||||
|
@ -58,7 +59,6 @@ export const ContractOverview = (props: {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ContractDetails contract={contract} />
|
<ContractDetails contract={contract} />
|
||||||
<TweetButton className="self-end md:hidden" tweetText={tweetText} />
|
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col className="hidden md:flex justify-between items-end">
|
<Col className="hidden md:flex justify-between items-end">
|
||||||
|
@ -68,7 +68,6 @@ export const ContractOverview = (props: {
|
||||||
probPercent={probPercent}
|
probPercent={probPercent}
|
||||||
large
|
large
|
||||||
/>
|
/>
|
||||||
<TweetButton className="mt-6" tweetText={tweetText} />
|
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
|
@ -76,6 +75,11 @@ export const ContractOverview = (props: {
|
||||||
|
|
||||||
<ContractProbGraph contract={contract} />
|
<ContractProbGraph contract={contract} />
|
||||||
|
|
||||||
|
<Row className="justify-between mt-6 ml-4 gap-4">
|
||||||
|
<TagsInput contract={contract} />
|
||||||
|
<TweetButton tweetText={tweetText} />
|
||||||
|
</Row>
|
||||||
|
|
||||||
<Spacer h={12} />
|
<Spacer h={12} />
|
||||||
|
|
||||||
{/* Show a delete button for contracts without any trading */}
|
{/* Show a delete button for contracts without any trading */}
|
||||||
|
|
45
web/components/tags-input.tsx
Normal file
45
web/components/tags-input.tsx
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import { useState } from 'react'
|
||||||
|
import { parseWordsAsTags } from '../../common/util/parse'
|
||||||
|
import { Contract, updateContract } from '../lib/firebase/contracts'
|
||||||
|
import { Row } from './layout/row'
|
||||||
|
import { TagsList } from './tags-list'
|
||||||
|
|
||||||
|
export function TagsInput(props: { contract: Contract }) {
|
||||||
|
const { contract } = props
|
||||||
|
const { tags } = contract
|
||||||
|
|
||||||
|
const [tagText, setTagText] = useState('')
|
||||||
|
const newTags = parseWordsAsTags(`${tags.join(' ')} ${tagText}`)
|
||||||
|
|
||||||
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
||||||
|
|
||||||
|
const updateTags = () => {
|
||||||
|
setIsSubmitting(true)
|
||||||
|
updateContract(contract.id, {
|
||||||
|
tags: newTags,
|
||||||
|
lowercaseTags: newTags.map((tag) => tag.toLowerCase()),
|
||||||
|
})
|
||||||
|
setIsSubmitting(false)
|
||||||
|
setTagText('')
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Row className="flex-wrap gap-4">
|
||||||
|
<TagsList tags={newTags.map((tag) => `#${tag}`)} />
|
||||||
|
|
||||||
|
<Row className="items-center gap-4">
|
||||||
|
<input
|
||||||
|
style={{ maxWidth: 150 }}
|
||||||
|
placeholder="Type a tag..."
|
||||||
|
className="input input-sm input-bordered resize-none"
|
||||||
|
disabled={isSubmitting}
|
||||||
|
value={tagText}
|
||||||
|
onChange={(e) => setTagText(e.target.value || '')}
|
||||||
|
/>
|
||||||
|
<button className="btn btn-xs btn-outline" onClick={updateTags}>
|
||||||
|
Save tags
|
||||||
|
</button>
|
||||||
|
</Row>
|
||||||
|
</Row>
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user