Use public Discord collectibles catalog.
All checks were successful
Trigger cinny-mobile / dispatch (push) Successful in 2s
All checks were successful
Trigger cinny-mobile / dispatch (push) Successful in 2s
Remove local token setup in favor of the cached published catalog and document the collectible profile experience in the latest update notes.
This commit is contained in:
@@ -338,9 +338,6 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
);
|
||||
const previewDisplayName = profile.displayName;
|
||||
const [kind, setKind] = useState<CollectibleKind>('profile_effect');
|
||||
const [hasToken, setHasToken] = useState(false);
|
||||
const [tokenInput, setTokenInput] = useState('');
|
||||
const [tokenSaving, setTokenSaving] = useState(false);
|
||||
const [catalogLoading, setCatalogLoading] = useState(false);
|
||||
const [catalogError, setCatalogError] = useState<string>();
|
||||
const [items, setItems] = useState<DiscordCollectibleItem[]>([]);
|
||||
@@ -352,12 +349,6 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
|
||||
const desktopAvailable = isElectronCollectiblesAvailable();
|
||||
|
||||
const refreshTokenState = useCallback(async () => {
|
||||
if (!desktopAvailable) return;
|
||||
const result = await window.electron!.discordCollectibles!.hasToken();
|
||||
setHasToken(Boolean(result?.data));
|
||||
}, [desktopAvailable]);
|
||||
|
||||
const loadCatalog = useCallback(async (force = false) => {
|
||||
if (!desktopAvailable) return;
|
||||
setCatalogLoading(true);
|
||||
@@ -376,14 +367,8 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
}, [desktopAvailable]);
|
||||
|
||||
useEffect(() => {
|
||||
refreshTokenState();
|
||||
}, [refreshTokenState]);
|
||||
|
||||
useEffect(() => {
|
||||
if (hasToken) {
|
||||
loadCatalog();
|
||||
}
|
||||
}, [hasToken, loadCatalog]);
|
||||
loadCatalog();
|
||||
}, [loadCatalog]);
|
||||
|
||||
const current = collectibles[KIND_FIELD[kind]];
|
||||
|
||||
@@ -416,27 +401,6 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
});
|
||||
}, [filteredGroups]);
|
||||
|
||||
const handleSaveToken = async () => {
|
||||
if (!desktopAvailable) return;
|
||||
setTokenSaving(true);
|
||||
setCatalogError(undefined);
|
||||
try {
|
||||
await window.electron!.discordCollectibles!.setToken(tokenInput);
|
||||
setTokenInput('');
|
||||
await refreshTokenState();
|
||||
} catch (e) {
|
||||
setCatalogError(e instanceof Error ? e.message : 'Failed to save token.');
|
||||
}
|
||||
setTokenSaving(false);
|
||||
};
|
||||
|
||||
const handleClearToken = async () => {
|
||||
if (!desktopAvailable) return;
|
||||
await window.electron!.discordCollectibles!.clearToken();
|
||||
setItems([]);
|
||||
await refreshTokenState();
|
||||
};
|
||||
|
||||
const handleApply = async (item: DiscordCollectibleItem) => {
|
||||
setApplyingId(item.id);
|
||||
setError(undefined);
|
||||
@@ -481,48 +445,24 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
return (
|
||||
<Box direction="Column" gap="300">
|
||||
<Text size="T200" style={{ opacity: 0.8 }}>
|
||||
Browse Discord shop collectibles live, then download and upload only what you pick to Matrix.
|
||||
Your Discord token stays on this device and is only used to list the shop catalog.
|
||||
Browse a community-published Discord collectibles catalog, then download and upload only what
|
||||
you pick to Matrix.
|
||||
</Text>
|
||||
|
||||
{!hasToken ? (
|
||||
<Box direction="Column" gap="200">
|
||||
<Text size="T300">Discord token (required to list the shop)</Text>
|
||||
<Input
|
||||
size="300"
|
||||
variant="Secondary"
|
||||
style={{ width: '100%' }}
|
||||
type="password"
|
||||
placeholder="User token or Bot xxxxx"
|
||||
value={tokenInput}
|
||||
onChange={(e) => setTokenInput(e.target.value)}
|
||||
/>
|
||||
<Button
|
||||
size="300"
|
||||
variant="Primary"
|
||||
fill="Solid"
|
||||
radii="300"
|
||||
onClick={handleSaveToken}
|
||||
disabled={tokenSaving || !tokenInput.trim()}
|
||||
>
|
||||
<Text size="B300">{tokenSaving ? 'Saving…' : 'Save token'}</Text>
|
||||
</Button>
|
||||
{catalogError && <Text size="T200" style={{ color: color.Critical.Main }}>{catalogError}</Text>}
|
||||
</Box>
|
||||
) : (
|
||||
<Box gap="200" alignItems="Center" wrap="Wrap">
|
||||
<Text size="T200" style={{ opacity: 0.8 }}>Discord token saved on this device.</Text>
|
||||
<Button size="300" variant="Secondary" fill="Soft" radii="300" onClick={() => loadCatalog(true)} disabled={catalogLoading}>
|
||||
<Text size="B300">{catalogLoading ? 'Refreshing…' : 'Refresh catalog'}</Text>
|
||||
</Button>
|
||||
<Button size="300" variant="Critical" fill="Soft" radii="300" onClick={handleClearToken}>
|
||||
<Text size="B300">Remove token</Text>
|
||||
</Button>
|
||||
</Box>
|
||||
)}
|
||||
<Box gap="200" alignItems="Center" wrap="Wrap">
|
||||
<Button
|
||||
size="300"
|
||||
variant="Secondary"
|
||||
fill="Soft"
|
||||
radii="300"
|
||||
onClick={() => loadCatalog(true)}
|
||||
disabled={catalogLoading}
|
||||
>
|
||||
<Text size="B300">{catalogLoading ? 'Refreshing…' : 'Refresh catalog'}</Text>
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
{hasToken && (
|
||||
<>
|
||||
<>
|
||||
<Box gap="200" wrap="Wrap">
|
||||
{KIND_TABS.map((tab) => (
|
||||
<Button
|
||||
@@ -559,7 +499,7 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
{catalogLoading && (
|
||||
<Box gap="200" alignItems="Center">
|
||||
<Spinner size="100" variant="Secondary" />
|
||||
<Text size="T200">Loading catalog from Discord…</Text>
|
||||
<Text size="T200">Loading collectibles catalog…</Text>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
@@ -606,8 +546,7 @@ export function CollectiblesSection({ collectibles, onApply }: CollectiblesSecti
|
||||
{!catalogLoading && filteredGroups.length === 0 && (
|
||||
<Text size="T200" style={{ opacity: 0.7 }}>No items match your search.</Text>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user