···11import type { Route } from "@std/http/unstable-route";
22import { withAuth } from "../../../routes/middleware.ts";
33import { createSessionClient, publicClient } from "../../../config.ts";
44-import { buildSliceUri } from "../../../utils/at-uri.ts";
44+import { buildSliceUri, getRkeyFromUri } from "../../../utils/at-uri.ts";
55import { renderHTML } from "../../../utils/render.tsx";
66import { hxRedirect } from "../../../utils/htmx.ts";
77import {
···1010} from "../../../routes/slice-middleware.ts";
1111import { extractSliceParams } from "../../../utils/slice-params.ts";
1212import { validateDomain } from "../../../utils/validation.ts";
1313+import { getSliceClient } from "../../../utils/client.ts";
1314import { SliceSettings } from "./templates/SliceSettings.tsx";
14151516async function handleSliceSettingsPage(
···77787879 const domainError = validateDomain(domain);
7980 if (domainError) {
8080- const errorParam = domainError === "Domain is required"
8181- ? "domain_required"
8282- : domainError.includes("is not supported")
8383- ? "unsupported_domain"
8484- : "invalid_domain_format";
8181+ const errorParam =
8282+ domainError === "Domain is required"
8383+ ? "domain_required"
8484+ : domainError.includes("is not supported")
8585+ ? "unsupported_domain"
8686+ : "invalid_domain_format";
85878688 return hxRedirect(
8787- `/profile/${context.currentUser.handle}/slice/${sliceId}/settings?error=${errorParam}&message=${encodeURIComponent(domainError)}`
8989+ `/profile/${
9090+ context.currentUser.handle
9191+ }/slice/${sliceId}/settings?error=${errorParam}&message=${encodeURIComponent(
9292+ domainError
9393+ )}`
8894 );
8995 }
9096···187193188194 // 2. Delete all lexicons for this slice
189195 try {
190190- const lexicons = await sessionClient.network.slices.lexicon.getRecords({
191191- limit: 100,
192192- });
196196+ const sliceClient = getSliceClient(context, sliceId);
197197+ let cursor: string | undefined = undefined;
198198+199199+ do {
200200+ const lexicons = await sliceClient.network.slices.lexicon.getRecords({
201201+ limit: 100,
202202+ cursor,
203203+ });
193204194194- for (const lexicon of lexicons.records) {
195195- const rkey = lexicon.uri.split("/").pop();
196196- if (rkey) {
197197- await sessionClient.network.slices.lexicon.deleteRecord(rkey);
205205+ for (const lexicon of lexicons.records) {
206206+ const rkey = getRkeyFromUri(lexicon.uri);
207207+ await sliceClient.network.slices.lexicon.deleteRecord(rkey);
198208 }
199199- }
209209+210210+ cursor = lexicons.cursor;
211211+ } while (cursor);
200212 } catch (_error) {
201213 // Continue even if lexicon cleanup fails
202214 }
+6-8
frontend/src/utils/validation.ts
···11-// List of domains that are not supported for slices
22-const UNSUPPORTED_DOMAINS = [
33- "app.bsky",
44- "com.atproto",
55-];
11+// List of domains that are not supported as primary domains (trying to prevent long running syncs for now)
22+const UNSUPPORTED_DOMAINS = ["app.bsky"];
6374export function validateDomain(domain: string): string | null {
85 const trimmedDomain = domain.trim();
···1613 }
17141815 // Domain must have at least two parts (e.g. social.grain)
1919- if (!trimmedDomain.includes('.')) {
1616+ if (!trimmedDomain.includes(".")) {
2017 return "Domain must have at least two parts (e.g. social.grain)";
2118 }
22192320 // Validate domain format
2424- const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/;
2121+ const domainRegex =
2222+ /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/;
2523 if (!domainRegex.test(trimmedDomain)) {
2624 return "Domain must be a valid format (e.g. social.grain)";
2725 }
···3230// Function to get the list of unsupported domains (for debugging/admin purposes)
3331export function getUnsupportedDomains(): readonly string[] {
3432 return UNSUPPORTED_DOMAINS;
3535-}3333+}