Skip to content

Commit 270cb0b

Browse files
authored
chore: cleanup (#17284)
1 parent 46ba9c8 commit 270cb0b

23 files changed

Lines changed: 516 additions & 357 deletions

packages/app/src/components/status-popover.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,17 @@ const useServerHealth = (servers: Accessor<ServerConnection.Any[]>) => {
8686
const useDefaultServerKey = (
8787
get: (() => string | Promise<string | null | undefined> | null | undefined) | undefined,
8888
) => {
89-
const [url, setUrl] = createSignal<string | undefined>()
90-
const [tick, setTick] = createSignal(0)
89+
const [state, setState] = createStore({
90+
url: undefined as string | undefined,
91+
tick: 0,
92+
})
9193

9294
createEffect(() => {
93-
tick()
95+
state.tick
9496
let dead = false
9597
const result = get?.()
9698
if (!result) {
97-
setUrl(undefined)
99+
setState("url", undefined)
98100
onCleanup(() => {
99101
dead = true
100102
})
@@ -104,27 +106,27 @@ const useDefaultServerKey = (
104106
if (result instanceof Promise) {
105107
void result.then((next) => {
106108
if (dead) return
107-
setUrl(next ? normalizeServerUrl(next) : undefined)
109+
setState("url", next ? normalizeServerUrl(next) : undefined)
108110
})
109111
onCleanup(() => {
110112
dead = true
111113
})
112114
return
113115
}
114116

115-
setUrl(normalizeServerUrl(result))
117+
setState("url", normalizeServerUrl(result))
116118
onCleanup(() => {
117119
dead = true
118120
})
119121
})
120122

121123
return {
122124
key: () => {
123-
const u = url()
125+
const u = state.url
124126
if (!u) return
125127
return ServerConnection.key({ type: "http", http: { url: u } })
126128
},
127-
refresh: () => setTick((value) => value + 1),
129+
refresh: () => setState("tick", (value) => value + 1),
128130
}
129131
}
130132

packages/app/src/pages/layout.tsx

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,4 @@
1-
import {
2-
batch,
3-
createEffect,
4-
createMemo,
5-
createSignal,
6-
For,
7-
on,
8-
onCleanup,
9-
onMount,
10-
ParentProps,
11-
Show,
12-
untrack,
13-
} from "solid-js"
1+
import { batch, createEffect, createMemo, For, on, onCleanup, onMount, ParentProps, Show, untrack } from "solid-js"
142
import { useNavigate, useParams } from "@solidjs/router"
153
import { useLayout, LocalProject } from "@/context/layout"
164
import { useGlobalSync } from "@/context/global-sync"
@@ -145,6 +133,10 @@ export default function Layout(props: ParentProps) {
145133
hoverProject: undefined as string | undefined,
146134
scrollSessionKey: undefined as string | undefined,
147135
nav: undefined as HTMLElement | undefined,
136+
sortNow: Date.now(),
137+
sizing: false,
138+
peek: undefined as LocalProject | undefined,
139+
peeked: false,
148140
})
149141

150142
const editor = createInlineEditorController()
@@ -163,14 +155,13 @@ export default function Layout(props: ParentProps) {
163155
}
164156
const isBusy = (directory: string) => !!state.busyWorkspaces[workspaceKey(directory)]
165157
const navLeave = { current: undefined as number | undefined }
166-
const [sortNow, setSortNow] = createSignal(Date.now())
167-
const [sizing, setSizing] = createSignal(false)
158+
const sortNow = () => state.sortNow
168159
let sizet: number | undefined
169160
let sortNowInterval: ReturnType<typeof setInterval> | undefined
170161
const sortNowTimeout = setTimeout(
171162
() => {
172-
setSortNow(Date.now())
173-
sortNowInterval = setInterval(() => setSortNow(Date.now()), 60_000)
163+
setState("sortNow", Date.now())
164+
sortNowInterval = setInterval(() => setState("sortNow", Date.now()), 60_000)
174165
},
175166
60_000 - (Date.now() % 60_000),
176167
)
@@ -196,7 +187,7 @@ export default function Layout(props: ParentProps) {
196187
})
197188

198189
onMount(() => {
199-
const stop = () => setSizing(false)
190+
const stop = () => setState("sizing", false)
200191
window.addEventListener("pointerup", stop)
201192
window.addEventListener("pointercancel", stop)
202193
window.addEventListener("blur", stop)
@@ -234,8 +225,6 @@ export default function Layout(props: ParentProps) {
234225
}, 300)
235226
}
236227

237-
const [peek, setPeek] = createSignal<LocalProject | undefined>(undefined)
238-
const [peeked, setPeeked] = createSignal(false)
239228
let peekt: number | undefined
240229

241230
const hoverProjectData = createMemo(() => {
@@ -251,17 +240,17 @@ export default function Layout(props: ParentProps) {
251240
clearTimeout(peekt)
252241
peekt = undefined
253242
}
254-
setPeek(p)
255-
setPeeked(true)
243+
setState("peek", p)
244+
setState("peeked", true)
256245
return
257246
}
258247

259-
setPeeked(false)
260-
if (peek() === undefined) return
248+
setState("peeked", false)
249+
if (state.peek === undefined) return
261250
if (peekt !== undefined) clearTimeout(peekt)
262251
peekt = window.setTimeout(() => {
263252
peekt = undefined
264-
setPeek(undefined)
253+
setState("peek", undefined)
265254
}, 180)
266255
})
267256

@@ -2245,17 +2234,17 @@ export default function Layout(props: ParentProps) {
22452234
>
22462235
<div class="@container w-full h-full contain-strict">{sidebarContent()}</div>
22472236
<Show when={layout.sidebar.opened()}>
2248-
<div onPointerDown={() => setSizing(true)}>
2237+
<div onPointerDown={() => setState("sizing", true)}>
22492238
<ResizeHandle
22502239
direction="horizontal"
22512240
size={layout.sidebar.width()}
22522241
min={244}
22532242
max={typeof window === "undefined" ? 1000 : window.innerWidth * 0.3 + 64}
22542243
collapseThreshold={244}
22552244
onResize={(w) => {
2256-
setSizing(true)
2245+
setState("sizing", true)
22572246
if (sizet !== undefined) clearTimeout(sizet)
2258-
sizet = window.setTimeout(() => setSizing(false), 120)
2247+
sizet = window.setTimeout(() => setState("sizing", false), 120)
22592248
layout.sidebar.resize(w)
22602249
}}
22612250
onCollapse={layout.sidebar.close}
@@ -2300,7 +2289,7 @@ export default function Layout(props: ParentProps) {
23002289
"xl:inset-y-0 xl:right-0 xl:left-[var(--main-left)]": true,
23012290
"z-20": true,
23022291
"transition-[left] duration-200 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-[left] motion-reduce:transition-none":
2303-
!sizing(),
2292+
!state.sizing,
23042293
}}
23052294
style={{
23062295
"--main-left": layout.sidebar.opened() ? `${Math.max(layout.sidebar.width(), 244)}px` : "4rem",
@@ -2320,11 +2309,11 @@ export default function Layout(props: ParentProps) {
23202309
<div
23212310
classList={{
23222311
"hidden xl:flex absolute inset-y-0 left-16 z-30": true,
2323-
"opacity-100 translate-x-0 pointer-events-auto": peeked() && !layout.sidebar.opened(),
2324-
"opacity-0 -translate-x-2 pointer-events-none": !peeked() || layout.sidebar.opened(),
2312+
"opacity-100 translate-x-0 pointer-events-auto": state.peeked && !layout.sidebar.opened(),
2313+
"opacity-0 -translate-x-2 pointer-events-none": !state.peeked || layout.sidebar.opened(),
23252314
"transition-[opacity,transform] motion-reduce:transition-none": true,
2326-
"duration-180 ease-out": peeked() && !layout.sidebar.opened(),
2327-
"duration-120 ease-in": !peeked() || layout.sidebar.opened(),
2315+
"duration-180 ease-out": state.peeked && !layout.sidebar.opened(),
2316+
"duration-120 ease-in": !state.peeked || layout.sidebar.opened(),
23282317
}}
23292318
onMouseMove={disarm}
23302319
onMouseEnter={() => {
@@ -2336,19 +2325,19 @@ export default function Layout(props: ParentProps) {
23362325
arm()
23372326
}}
23382327
>
2339-
<Show when={peek()}>
2340-
<SidebarPanel project={peek()} merged={false} />
2328+
<Show when={state.peek}>
2329+
<SidebarPanel project={state.peek} merged={false} />
23412330
</Show>
23422331
</div>
23432332

23442333
<div
23452334
classList={{
23462335
"hidden xl:block pointer-events-none absolute inset-y-0 right-0 z-25 overflow-hidden": true,
2347-
"opacity-100 translate-x-0": peeked() && !layout.sidebar.opened(),
2348-
"opacity-0 -translate-x-2": !peeked() || layout.sidebar.opened(),
2336+
"opacity-100 translate-x-0": state.peeked && !layout.sidebar.opened(),
2337+
"opacity-0 -translate-x-2": !state.peeked || layout.sidebar.opened(),
23492338
"transition-[opacity,transform] motion-reduce:transition-none": true,
2350-
"duration-180 ease-out": peeked() && !layout.sidebar.opened(),
2351-
"duration-120 ease-in": !peeked() || layout.sidebar.opened(),
2339+
"duration-180 ease-out": state.peeked && !layout.sidebar.opened(),
2340+
"duration-120 ease-in": !state.peeked || layout.sidebar.opened(),
23522341
}}
23532342
style={{ left: `calc(4rem + ${Math.max(Math.max(layout.sidebar.width(), 244) - 64, 0)}px)` }}
23542343
>

packages/ui/src/components/animated-number.tsx

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { For, Index, createEffect, createMemo, createSignal, on } from "solid-js"
1+
import { For, Index, createEffect, createMemo, on } from "solid-js"
2+
import { createStore } from "solid-js/store"
23

34
const TRACK = Array.from({ length: 30 }, (_, index) => index % 10)
45
const DURATION = 600
@@ -14,8 +15,12 @@ function spin(from: number, to: number, direction: 1 | -1) {
1415
}
1516

1617
function Digit(props: { value: number; direction: 1 | -1 }) {
17-
const [step, setStep] = createSignal(props.value + 10)
18-
const [animating, setAnimating] = createSignal(false)
18+
const [state, setState] = createStore({
19+
step: props.value + 10,
20+
animating: false,
21+
})
22+
const step = () => state.step
23+
const animating = () => state.animating
1924
let last = props.value
2025

2126
createEffect(
@@ -25,13 +30,13 @@ function Digit(props: { value: number; direction: 1 | -1 }) {
2530
const delta = spin(last, next, props.direction)
2631
last = next
2732
if (!delta) {
28-
setAnimating(false)
29-
setStep(next + 10)
33+
setState("animating", false)
34+
setState("step", next + 10)
3035
return
3136
}
3237

33-
setAnimating(true)
34-
setStep((value) => value + delta)
38+
setState("animating", true)
39+
setState("step", (value) => value + delta)
3540
},
3641
{ defer: true },
3742
),
@@ -43,8 +48,8 @@ function Digit(props: { value: number; direction: 1 | -1 }) {
4348
data-slot="animated-number-strip"
4449
data-animating={animating() ? "true" : "false"}
4550
onTransitionEnd={() => {
46-
setAnimating(false)
47-
setStep((value) => normalize(value) + 10)
51+
setState("animating", false)
52+
setState("step", (value) => normalize(value) + 10)
4853
}}
4954
style={{
5055
"--animated-number-offset": `${step()}`,
@@ -63,8 +68,12 @@ export function AnimatedNumber(props: { value: number; class?: string }) {
6368
return Math.max(0, Math.round(props.value))
6469
})
6570

66-
const [value, setValue] = createSignal(target())
67-
const [direction, setDirection] = createSignal<1 | -1>(1)
71+
const [state, setState] = createStore({
72+
value: target(),
73+
direction: 1 as 1 | -1,
74+
})
75+
const value = () => state.value
76+
const direction = () => state.direction
6877

6978
createEffect(
7079
on(
@@ -73,8 +82,8 @@ export function AnimatedNumber(props: { value: number; class?: string }) {
7382
const current = value()
7483
if (next === current) return
7584

76-
setDirection(next > current ? 1 : -1)
77-
setValue(next)
85+
setState("direction", next > current ? 1 : -1)
86+
setState("value", next)
7887
},
7988
{ defer: true },
8089
),

packages/ui/src/components/basic-tool.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { createEffect, createSignal, For, Match, on, onCleanup, Show, Switch, type JSX } from "solid-js"
1+
import { createEffect, For, Match, on, onCleanup, Show, Switch, type JSX } from "solid-js"
22
import { animate, type AnimationPlaybackControls } from "motion"
3+
import { createStore } from "solid-js/store"
34
import { Collapsible } from "./collapsible"
45
import type { IconProps } from "./icon"
56
import { TextShimmer } from "./text-shimmer"
@@ -37,8 +38,12 @@ export interface BasicToolProps {
3738
const SPRING = { type: "spring" as const, visualDuration: 0.35, bounce: 0 }
3839

3940
export function BasicTool(props: BasicToolProps) {
40-
const [open, setOpen] = createSignal(props.defaultOpen ?? false)
41-
const [ready, setReady] = createSignal(open())
41+
const [state, setState] = createStore({
42+
open: props.defaultOpen ?? false,
43+
ready: props.defaultOpen ?? false,
44+
})
45+
const open = () => state.open
46+
const ready = () => state.ready
4247
const pending = () => props.status === "pending" || props.status === "running"
4348

4449
let frame: number | undefined
@@ -52,7 +57,7 @@ export function BasicTool(props: BasicToolProps) {
5257
onCleanup(cancel)
5358

5459
createEffect(() => {
55-
if (props.forceOpen) setOpen(true)
60+
if (props.forceOpen) setState("open", true)
5661
})
5762

5863
createEffect(
@@ -62,15 +67,15 @@ export function BasicTool(props: BasicToolProps) {
6267
if (!props.defer) return
6368
if (!value) {
6469
cancel()
65-
setReady(false)
70+
setState("ready", false)
6671
return
6772
}
6873

6974
cancel()
7075
frame = requestAnimationFrame(() => {
7176
frame = undefined
7277
if (!open()) return
73-
setReady(true)
78+
setState("ready", true)
7479
})
7580
},
7681
{ defer: true },
@@ -112,7 +117,7 @@ export function BasicTool(props: BasicToolProps) {
112117
const handleOpenChange = (value: boolean) => {
113118
if (pending()) return
114119
if (props.locked && !value) return
115-
setOpen(value)
120+
setState("open", value)
116121
}
117122

118123
return (

packages/ui/src/components/line-comment-annotations.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { type DiffLineAnnotation, type SelectedLineRange } from "@pierre/diffs"
22
import { createEffect, createMemo, createSignal, onCleanup, Show, type Accessor, type JSX } from "solid-js"
3+
import { createStore } from "solid-js/store"
34
import { render as renderSolid } from "solid-js/web"
45
import { createHoverCommentUtility } from "../pierre/comment-hover"
56
import { cloneSelectedLineRange, formatSelectedLineLabel, lineInSelectedRange } from "../pierre/selection-bridge"
@@ -200,8 +201,14 @@ export function createLineCommentAnnotationRenderer<T>(props: {
200201
}
201202

202203
export function createLineCommentState<T>(props: LineCommentStateProps<T>) {
203-
const [draft, setDraft] = createSignal("")
204-
const [editing, setEditing] = createSignal<T | null>(null)
204+
const [state, setState] = createStore({
205+
draft: "",
206+
editing: null as T | null,
207+
})
208+
const draft = () => state.draft
209+
const setDraft = (value: string) => setState("draft", value)
210+
const editing = () => state.editing
211+
const setEditing = (value: T | null) => setState("editing", typeof value === "function" ? () => value : value)
205212

206213
const toRange = (range: SelectedLineRange | null) => (range ? cloneSelectedLineRange(range) : null)
207214
const setSelected = (range: SelectedLineRange | null) => {
@@ -261,7 +268,7 @@ export function createLineCommentState<T>(props: LineCommentStateProps<T>) {
261268
closeComment()
262269
setSelected(range)
263270
props.setCommenting(null)
264-
setEditing(() => id)
271+
setEditing(id)
265272
setDraft(value)
266273
}
267274

0 commit comments

Comments
 (0)