Skip to content
Open
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
66 changes: 43 additions & 23 deletions apps/web/src/components/settings/AccountLinkHelpSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,26 @@ export function AccountLinkHelpSection() {
</>
);

const loadError = (
<div className="flex items-center gap-2 rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm text-destructive">
<AlertCircle className="size-4 shrink-0" />
<p className="flex-1">
{settingsQuery.data
? 'Failed to refresh account linking help.'
: 'Failed to load account linking help.'}
</p>
<Button
type="button"
variant="outline"
size="sm"
disabled={settingsQuery.isFetching}
onClick={() => void settingsQuery.refetch()}
>
Retry
</Button>
</div>
);

return (
<Section icon={LucideLink} title="Account linking help" footer={footer}>
<p className="text-sm text-muted-foreground">
Expand All @@ -84,30 +104,30 @@ export function AccountLinkHelpSection() {
</p>
{settingsQuery.isPending ? (
<Skeleton className="h-24 w-full max-w-2xl" />
) : settingsQuery.isError ? (
<div className="flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm text-destructive">
<AlertCircle className="mt-0.5 size-4 shrink-0" />
<p>Failed to load account linking help.</p>
</div>
) : (
<div className="max-w-2xl space-y-2">
<Label htmlFor="account-link-help-text" className="sr-only">
Account linking help text
</Label>
<Textarea
id="account-link-help-text"
value={value}
onChange={(event) => setValue(event.target.value)}
maxLength={1000}
rows={3}
placeholder="If you need an invite, ask an admin in Discord: https://discord.gg/..."
disabled={updateMutation.isPending}
/>
<p className="text-xs text-muted-foreground">
Markdown links are supported. Plain text with a full URL works on
every supported surface.
</p>
</div>
<>
{settingsQuery.isError ? loadError : null}
{settingsQuery.data ? (
<div className="max-w-2xl space-y-2">
<Label htmlFor="account-link-help-text" className="sr-only">
Account linking help text
</Label>
<Textarea
id="account-link-help-text"
value={value}
onChange={(event) => setValue(event.target.value)}
maxLength={1000}
rows={3}
placeholder="If you need an invite, ask an admin in Discord: https://discord.gg/..."
disabled={updateMutation.isPending}
/>
<p className="text-xs text-muted-foreground">
Markdown links are supported. Plain text with a full URL works
on every supported surface.
</p>
</div>
) : null}
</>
)}
</Section>
);
Expand Down
158 changes: 151 additions & 7 deletions apps/web/src/components/settings/UsersSettings.client.test.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 23 additions & 7 deletions apps/web/src/components/settings/UsersSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -234,13 +234,28 @@ export function UsersSettings() {
return <Skeleton className="h-64 w-full" />;
}

if (settingsQuery.isError || !settingsQuery.data) {
return (
<div className="flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm text-destructive">
<AlertCircle className="mt-0.5 size-4 shrink-0" />
<p>Failed to load user settings.</p>
</div>
);
const loadError = (
<div className="flex items-center gap-2 rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm text-destructive">
<AlertCircle className="size-4 shrink-0" />
<p className="flex-1">
{settingsQuery.data
? 'Failed to refresh user settings.'
: 'Failed to load user settings.'}
</p>
<Button
type="button"
variant="outline"
size="sm"
disabled={settingsQuery.isFetching}
onClick={() => void settingsQuery.refetch()}
>
Retry
</Button>
</div>
);

if (!settingsQuery.data) {
return loadError;
}

const {
Expand Down Expand Up @@ -327,6 +342,7 @@ export function UsersSettings() {

return (
<div className="space-y-6">
{settingsQuery.isError ? loadError : null}
{cloudEnabled ? null : (
<Section icon={ScrollText} title="License">
<div className="space-y-4">
Expand Down
Loading