Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 46 additions & 34 deletions components/waves/CreateDropContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -470,27 +470,29 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
() =>
editorState
? exportDropMarkdown(editorState, [
...SAFE_MARKDOWN_TRANSFORMERS,
MENTION_TRANSFORMER,
HASHTAG_TRANSFORMER,
IMAGE_TRANSFORMER,
EMOJI_TRANSFORMER,
])
...SAFE_MARKDOWN_TRANSFORMERS,
MENTION_TRANSFORMER,
HASHTAG_TRANSFORMER,
IMAGE_TRANSFORMER,
EMOJI_TRANSFORMER,
])
: null,
[editorState]
);

const sendTyping = React.useCallback(() => {
send(WsMessageType.USER_IS_TYPING, { wave_id: wave.id });
}, [send, wave.id]);

const throttleHandle = useMemo(() => {
return throttle(() => {
send(WsMessageType.USER_IS_TYPING, { wave_id: wave.id });
}, 4000);
}, []);
return throttle(sendTyping, 4000);
}, [sendTyping]);

useEffect(() => {
if (getMarkdown?.length) {
throttleHandle();
}
}, [getMarkdown]);
}, [getMarkdown, throttleHandle]);

const getCanSubmitStorm = () => {
const markdown = getMarkdown;
Expand Down Expand Up @@ -522,8 +524,8 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
) ?? 0) >= 24000;

const getCanAddPart = () => getHaveMarkdownOrFile() && !getIsDropLimit();
const canSubmit = useMemo(() => getCanSubmit(), [getMarkdown, files, drop, hasMetadata]);
const canAddPart = useMemo(() => getCanAddPart(), [getMarkdown, files, drop]);
const canSubmit = getCanSubmit();
const canAddPart = getCanAddPart();

const [referencedNfts, setReferencedNfts] = useState<ReferencedNft[]>([]);

Expand Down Expand Up @@ -613,24 +615,24 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
): CreateDropConfig => {
const hasPartsInDrop = (drop?.parts.length ?? 0) > 0;
const hasCurrentContent = !!(markdown?.trim().length || files.length);

const newParts = hasPartsInDrop && !hasCurrentContent
? drop?.parts ?? []
: [
...(drop?.parts ?? []),
{
content: markdown?.length ? markdown : null,
quoted_drop:
activeDrop?.action === ActiveDropAction.QUOTE
? {
drop_id: activeDrop.drop.id,
drop_part_id: activeDrop.partId,
}
: null,
media: files,
},
];
...(drop?.parts ?? []),
{
content: markdown?.length ? markdown : null,
quoted_drop:
activeDrop?.action === ActiveDropAction.QUOTE
? {
drop_id: activeDrop.drop.id,
drop_part_id: activeDrop.partId,
}
: null,
media: files,
},
];

const parts = ensurePartsWithFallback(newParts, hasMetadata);

return {
Expand Down Expand Up @@ -805,7 +807,7 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
activeDrop,
isDropMode ? ApiDropType.Participatory : ApiDropType.Chat
);

if (optimisticDrop) {
addOptimisticDrop({ drop: optimisticDrop });
setTimeout(
Expand All @@ -830,7 +832,7 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
}
setFiles([]);
refreshState();

submitDrop({
drop: updatedDropRequest,
dropId: optimisticDrop?.id ?? null,
Expand Down Expand Up @@ -875,15 +877,15 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
) {
return;
}

const hasPartsInDrop = (drop?.parts.length ?? 0) > 0;
const hasCurrentContent = !!(getMarkdown?.trim().length || files.length);

if (hasPartsInDrop && hasCurrentContent) {
finalizeAndAddDropPart();
return;
}

await prepareAndSubmitDrop(getUpdatedDrop());
};

Expand Down Expand Up @@ -980,7 +982,7 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
if (!drop.parts.length) {
setIsStormMode(false);
}
}, [drop?.parts]);
}, [drop, setIsStormMode]);

const [isMetadataOpen, setIsMetadataOpen] = useState(false);

Expand Down Expand Up @@ -1044,6 +1046,16 @@ const CreateDropContent: React.FC<CreateDropContentProps> = ({
}
}, [isApp, editingDropId, activeDrop, onCancelReplyQuote]);

const isChatClosed = wave.wave.type === ApiWaveType.Chat && !wave.chat.enabled;

if (isChatClosed) {
return (
<div className="tw-flex-grow tw-w-full tw-bg-iron-900 tw-text-iron-500 tw-rounded-lg tw-p-4 tw-text-center tw-text-sm tw-font-medium">
Wave is closed
</div>
);
}

return (
<div className="tw-flex-grow">
<CreateDropReplyingWrapper
Expand Down
53 changes: 23 additions & 30 deletions components/waves/leaderboard/time/TimelineToggleHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"use client";

import React from "react";
import { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown } from "@fortawesome/free-solid-svg-icons";
import { ApiWaveDecisionPause } from "@/generated/models/ApiWaveDecisionPause";
import { useWave } from "@/hooks/useWave";
import { ApiWave } from "@/generated/models/ApiWave";
Expand All @@ -17,7 +19,7 @@ interface TimelineToggleHeaderProps {
/**
* Renders the header for the timeline with toggle functionality
*/
export const TimelineToggleHeader: React.FC<TimelineToggleHeaderProps> = ({
export const TimelineToggleHeader: FC<TimelineToggleHeaderProps> = ({
isOpen,
setIsOpen,
nextDecisionTime,
Expand All @@ -34,26 +36,26 @@ export const TimelineToggleHeader: React.FC<TimelineToggleHeaderProps> = ({
return (
<span className="tw-inline-flex tw-items-center tw-gap-x-2 sm:tw-gap-x-2.5 tw-px-3 tw-py-1.5 tw-rounded-md tw-text-xs tw-bg-gradient-to-r tw-from-iron-800/90 tw-to-iron-700/70 group-hover:tw-from-iron-700/60 group-hover:tw-to-iron-600/40 tw-border tw-border-iron-600/40 group-hover:tw-border-iron-600/30 tw-border-solid tw-shadow-sm group-hover:tw-shadow-none tw-transition-all tw-duration-300 tw-ease-out">
<span className="tw-font-bold tw-bg-gradient-to-r tw-from-amber-200 tw-via-amber-100 tw-to-amber-200/90 tw-bg-clip-text tw-text-transparent tw-whitespace-nowrap">
Congrats to all SZN 12 winners!
Congrats to last SZN winners!
</span>
<span className="tw-text-iron-500">•</span>
<span className="tw-text-iron-300 tw-font-medium tw-whitespace-nowrap">
SZN 13 starts:{" "}
Next SZN starts:{" "}
{(() => {
const mintingDate =
wave && waveData ? waveData.pauses.calculateMintingDate(nextDecisionTime) : null;
return mintingDate
? new Date(mintingDate).toLocaleDateString(undefined, {
month: "short",
day: "numeric",
})
: new Date(currentPause.end_time).toLocaleDateString(
undefined,
{
month: "short",
day: "numeric",
})
: new Date(currentPause.end_time).toLocaleDateString(
undefined,
{
month: "short",
day: "numeric",
}
);
}
);
})()}
</span>
</span>
Expand Down Expand Up @@ -83,35 +85,26 @@ export const TimelineToggleHeader: React.FC<TimelineToggleHeaderProps> = ({
className="tw-@container tw-px-3 tw-py-1.5 tw-bg-iron-800/95 tw-rounded-t-lg tw-border tw-border-solid tw-border-iron-700/50 tw-cursor-pointer desktop-hover:hover:tw-bg-iron-700/80 tw-transition-all tw-duration-300 tw-ease-out tw-group tw-shadow-sm"
onClick={() => setIsOpen(!isOpen)}>
<div className="tw-flex tw-items-center tw-gap-2 tw-w-full">
{/* Title */}

<span
className={`tw-text-xs tw-font-semibold tw-whitespace-nowrap tw-flex-shrink-0 ${
hasNextDecision ? "tw-text-iron-100" : "tw-text-iron-400"
}`}>
className={`tw-text-xs tw-font-semibold tw-whitespace-nowrap tw-flex-shrink-0 ${hasNextDecision ? "tw-text-iron-100" : "tw-text-iron-400"
}`}>
{hasNextDecision ? "Decision Timeline" : "Announcement history"}
</span>

{/* Status display - takes remaining space */}

<div className="tw-flex-1 tw-text-xs tw-font-medium tw-flex tw-justify-end tw-items-center">
{getStatusDisplay()}
</div>

<button
className="tw-w-6 tw-h-6 tw-flex tw-items-center tw-justify-center tw-bg-iron-700/50 tw-rounded-md tw-border tw-border-solid tw-border-iron-600/40 desktop-hover:hover:tw-bg-iron-600/60 desktop-hover:hover:tw-border-iron-500/50 tw-transition-all tw-duration-300 tw-ease-out tw-flex-shrink-0"
aria-label={isOpen ? "Collapse" : "Expand"}>
<svg
className={`tw-w-4 tw-h-4 tw-text-iron-200 desktop-hover:group-hover:tw-text-iron-100 tw-flex-shrink-0 ${
isOpen ? "tw-rotate-180" : ""
} tw-transition-all tw-duration-300 tw-ease-in-out`}
viewBox="0 0 20 20"
aria-hidden="true"
fill="currentColor">
<path
fillRule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clipRule="evenodd"
/>
</svg>
<FontAwesomeIcon
icon={faChevronDown}
className={`tw-w-4 tw-h-4 tw-text-iron-200 desktop-hover:group-hover:tw-text-iron-100 tw-flex-shrink-0 ${isOpen ? "tw-rotate-180" : ""
} tw-transition-all tw-duration-300 tw-ease-in-out`}
/>
</button>
</div>
</div>
Expand Down
Loading