ROSC design update

This commit is contained in:
Shaun Orssaud 2024-01-29 11:37:53 +09:00
parent 61ab971d56
commit bf6cc85d55
2 changed files with 216 additions and 153 deletions

View File

@ -8,4 +8,4 @@ services:
ports: ports:
- "3000:80" - "3000:80"
environment: environment:
- codex_url=${codex_url:-http://kubernetes.docker.internal:30001} - codex_url=${codex_url:-http://kubernetes.docker.internal:30003}

View File

@ -17,25 +17,36 @@ function CreateTab() {
const [expiry, setExpiry] = useState("") const [expiry, setExpiry] = useState("")
const [nodes, setNodes] = useState("") const [nodes, setNodes] = useState("")
const [tolerance, setTolerance] = useState("") const [tolerance, setTolerance] = useState("")
const [collateral, setCollateral,] = useState(""); const [collateral, setCollateral] = useState("");
const [error, setError] = useState(""); const [error, setError] = useState("");
const [isBoxOpen, setBoxOpen] = useState(false); const [isBoxOpenDuration, setBoxOpenDuration] = useState(false);
const [isBoxOpenExpiry, setBoxOpenExpiry] = useState(false);
const toggleBox = () => { const toggleBoxDuration = () => {
setBoxOpen(!isBoxOpen); setBoxOpenDuration(!isBoxOpenDuration);
}; };
const handleDateChange = (selectedDate: any) => { const toggleBoxExpiry = () => {
const timestamp = moment(selectedDate).unix(); setBoxOpenExpiry(!isBoxOpenExpiry);
setExpiry(timestamp.toString()); // Format the date as needed };
const handleExpiryChange = (newDuration: { days: number; hours: number; minutes: number; seconds: number }) => {
const { days, hours, minutes, seconds } = newDuration;
const totalSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds;
const timestamp = moment().unix() + totalSeconds;
setExpiry(timestamp.toString());
}; };
const handleDurationChange = (newDuration: { days: number; hours: number; minutes: number; seconds: number }) => { const handleDurationChange = (newDuration: { days: number; hours: number; minutes: number; seconds: number }) => {
const { days, hours, minutes, seconds } = newDuration; const { days, hours, minutes, seconds } = newDuration;
const totalSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds; const totalSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds;
if (totalSeconds >= 60 && totalSeconds <= 86400) {
setDuration(totalSeconds.toString()); setDuration(totalSeconds.toString());
}
}; };
function upload(cid: string) { function upload(cid: string) {
@ -80,9 +91,21 @@ function CreateTab() {
}); });
} }
const handleProofProbabilityChange = (e: any) => {
const value = e.target.value;
if (value === "" || (value >= 0 && value <= 99)) {
setProofProbability(value);
}
};
return ( return (
<> <>
<DurationInputWithFloatingBox isOpen={isBoxOpenDuration} onClose={toggleBoxDuration} onDurationChange={handleDurationChange} />
<DurationInputWithFloatingBox isOpen={isBoxOpenExpiry} onClose={toggleBoxExpiry} onDurationChange={handleExpiryChange} />
<CreateTabWrapper> <CreateTabWrapper>
<div className="row">
<div className="field">
<label>CID</label>
<input <input
type="text" type="text"
placeholder="CID" placeholder="CID"
@ -91,50 +114,42 @@ function CreateTab() {
}} }}
value={ftdCid} value={ftdCid}
/> />
<div id="divider"></div> </div>
</div>
<div className="row">
<div className="field">
<label>Duration</label>
<input <input
type="text" type="text"
placeholder="Duration" placeholder="Duration"
value={duration} value={duration}
onClick={toggleBox} onClick={toggleBoxDuration}
> />
</input> </div>
<DurationInputWithFloatingBox isOpen={isBoxOpen} onClose={toggleBox} onDurationChange={handleDurationChange} /> <div className="field">
<div id="divider"></div> <label>Expiry</label>
<input <input
type="text" type="text"
placeholder="Proof Probability" placeholder="Expiry"
onChange={(e) => { value={expiry}
setProofProbability(e.target.value); onClick={toggleBoxExpiry}
}}
value={proofProbability}
/> />
<div id="divider"></div> </div>
</div>
<div className="row">
<div className="field">
<label>Reward</label>
<input <input
type="text" type="text"
placeholder="Reward" placeholder="Reward"
onChange={(e) => setReward(e.target.value)} onChange={(e) => setReward(e.target.value)}
value={reward} value={reward}
/> />
<div id="divider"></div> </div>
{/* <input <div className="field">
type="text" <label>Nodes</label>
placeholder="Expiry"
onClick={toggleCalendar}
value={expiry}
/> */}
<DatePicker
selected={expiry ? moment.unix(parseInt(expiry)).toDate() : null}
onChange={handleDateChange}
minDate={new Date()} // Allow only future dates
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
timeCaption="Time"
dateFormat="MMMM Do YYYY, h:mm:ss a"
placeholderText="Select Expiry Date"
/>
<div id="divider"></div>
<input <input
type="text" type="text"
placeholder="Nodes" placeholder="Nodes"
@ -143,7 +158,9 @@ function CreateTab() {
}} }}
value={nodes} value={nodes}
/> />
<div id="divider"></div> </div>
<div className="field">
<label>Tolerance</label>
<input <input
type="text" type="text"
placeholder="Tolerance" placeholder="Tolerance"
@ -152,16 +169,43 @@ function CreateTab() {
}} }}
value={tolerance} value={tolerance}
/> />
<div id="divider"></div> </div>
<div className="field">
<label>Collateral</label>
<input <input
type="text" type="text"
placeholder="collateral" placeholder="Collateral"
onChange={(e) => setCollateral(e.target.value)} onChange={(e) => setCollateral(e.target.value)}
/> />
</div>
</div>
<div className="row">
<div className="field">
<label>Proof Probability</label>
<div>
<select
value={proofProbability}
onChange={handleProofProbabilityChange}
>
<option value="">Select Proof Probability</option>
<option value="1">Low Durability Guarantee</option>
<option value="3">Medium Durability Guarantee</option>
<option value="6">Strong Durability Guarantee</option>
</select>
</div>
<input
type="text"
placeholder="Custom Proof Probability"
value={proofProbability}
onChange={handleProofProbabilityChange}
/>
</div>
<button onClick={() => upload(ftdCid)}>Create</button> <button onClick={() => upload(ftdCid)}>Create</button>
</div>
</CreateTabWrapper> </CreateTabWrapper>
{error && ( {error && (
<p style={{ color: "red", marginTop: "10px", textAlign: "center" }}> <p style={{ color: "red", marginTop: "0px", textAlign: "center" }}>
{error} {error}
</p> </p>
)} )}
@ -172,86 +216,105 @@ function CreateTab() {
export default CreateTab; export default CreateTab;
const CreateTabWrapper = styled.div` const CreateTabWrapper = styled.div`
flex: 1;
display: flex;
flex-direction: column;
main {
display: flex; display: flex;
flex-direction: row;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 75%; height: 100%;
width: 100%;
padding: 16px 0px;
}
input { h1 {
flex: 3; color: ${constants.onSurfaceColor};
font-size: 24px;
margin: 16px;
}
.inputs {
padding: 16px;
display: flex;
align-items: center;
justify-content: center;
background-color: #141414;
border-radius: 8px;
width: 50%;
}
.row {
display: flex;
align-items: center;
justify-content: center;
}
.field {
display: flex;
align-items: left;
flex-direction: column;
height: 100%;
width: 100%;
padding: 0px 4px;
}
h4 {
color: ${constants.onSurfaceColor};
font-size: 20px;
margin: 16px;
}
input {
height: 60px; height: 60px;
padding: 10px 20px; padding: 10px 20px;
border: none; border: none;
background-color: ${constants.surfaceColor}; background-color: ${constants.surfaceColor};
color: ${constants.onSurfaceColor}; color: ${constants.onSurfaceColor};
width: 100%; width: 100%;
} border-radius: 8px;
margin: 16px 0px;
border: 2px dashed #9e9e9e;
border-radius: 8px;
text-align: center;
}
input:focus { input:focus {
outline: none; outline: none;
border: 2px solid ${constants.primaryColor}; border: 2px solid ${constants.primaryColor};
} }
input:nth-child(1) { button {
border-top-left-radius: 8px; height: 50%;
border-bottom-left-radius: 8px; width: 50%;
} margin-top: 40px;
#divider {
width: 2.5px;
height: 60px;
background-color: #555555;
}
button {
flex: 2;
height: 60px;
border: none; border: none;
background-color: ${constants.primaryColor}; background-color: ${constants.primaryColor};
color: ${constants.onPrimaryColor}; color: ${constants.onPrimaryColor};
font-size: 1rem; font-size: 1rem;
cursor: pointer; cursor: pointer;
border-top-right-radius: 8px; border-radius: 8px;
border-bottom-right-radius: 8px; }
width: 100%;
}
@media (max-width: 1180px) { button span {
font-weight: bold;
}
@media (max-width: 1180px) {
.inputs {
width: 80%; width: 80%;
} }
}
@media (max-width: 768px) { @media (max-width: 768px) {
.inputs {
width: 85%; width: 85%;
} }
}
@media (max-width: 450px) { @media (max-width: 450px) {
.inputs {
width: 90%; width: 90%;
} }
}
`; `;
const CustomDropdown = styled.div`
position: relative;
display: inline-block;
width: 150px;
`;
const DropdownContent = styled.div`
display: block;
position: absolute;
background-color: #555555;
min-width: 120px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 4;
right: 0;
`;
const DropdownOption = styled.div`
padding: 12px 16px;
text-decoration: none;
display: block;
cursor: pointer;
&:hover {
background-color: #f1f1f1;
}
`;