Skip to content

Commit b3f5914

Browse files
committed
refactor: add createComponentRef function to avoid ! and oxlint when defining solidjs ref
1 parent bb8f579 commit b3f5914

6 files changed

Lines changed: 33 additions & 14 deletions

File tree

src/domains/_core/components/alone-dialog/alone-dialog.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { type Component, createEffect } from "solid-js";
22
import { Dialog, type DialogRef } from "../../../ui/components/dialog/dialog";
3+
import { createComponentRef } from "../../utils/solid-js";
34
import { useAlone } from "./use-alone";
45

56
export const AloneDialog: Component = () => {
6-
// oxlint-disable-next-line init-declarations no-unassigned-vars
7-
let dialog!: DialogRef;
7+
const dialog = createComponentRef<DialogRef>();
88
const { alone } = useAlone();
99

1010
createEffect(() => {

src/domains/_core/utils/solid-js.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,23 @@ export async function createSingletonRootAsync<T>(
2424
await instance.isMounted;
2525
return () => instance;
2626
}
27+
28+
/**
29+
* This function returns undefined typed as T.
30+
* The usage of this function is strictly related to SolidJS component and ref setter.
31+
* If you write the ref natively, you have to use ! in conjonction of a comment to avoid lint issues
32+
* ```
33+
* // oxlint-disable-next-line init-declarations no-unassigned-vars
34+
* let dialog!: DialogRef;
35+
* ```
36+
*
37+
* Using this function we can "bypass" the behaviour like this.
38+
* ```
39+
* let dialog = createComponentRef<DialogRef>();
40+
* ```
41+
* It is important to use a let.
42+
*/
43+
export function createComponentRef<T>(): T {
44+
// oxlint-disable-next-line no-unsafe-type-assertion
45+
return undefined as T;
46+
}

src/domains/database/components/valibot-import-button/valibot-import-button.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isFunction, isString } from "remeda";
66
import { AdaptativeButton } from "../../../ui/components/buttons/adaptative-button";
77
import { DialogFooterClose } from "../../../ui/components/dialog/footers/dialog-footer-close";
88
import { ValibotErrorContent } from "./valibot-error-content";
9+
import { createComponentRef } from "../../../_core/utils/solid-js";
910
import { css } from "@emotion/css";
1011

1112
const sSuccess = css({
@@ -18,10 +19,9 @@ interface ValibotButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement>
1819
}
1920

2021
export const ValibotImportButton: Component<ValibotButtonProps> = (props) => {
21-
// oxlint-disable-next-line init-declarations no-unassigned-vars
22-
let dialogSuccess!: DialogRef;
23-
// oxlint-disable-next-line init-declarations no-unassigned-vars
24-
let dialogError!: DialogRef;
22+
const dialogSuccess = createComponentRef<DialogRef>();
23+
const dialogError = createComponentRef<DialogRef>();
24+
2525
const [data, setData] = createSignal<Array<AttemptsEntityIssue> | undefined>(undefined);
2626

2727
const args = createMemo<JSX.ButtonHTMLAttributes<HTMLButtonElement>>(() => {

src/domains/obs/popup-obs.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { type Component, Match, Switch, createEffect, createMemo, createSignal, on, onMount } from "solid-js";
22
import { VerticalAttemptsComparisonTable } from "../attempt/components/attempts-comparison-table/vertical-attempts-comparison-table";
3+
import { createComponentRef } from "../_core/utils/solid-js";
34
import { css } from "@emotion/css";
45
import { useObsListener } from "./compositions/use-obs-listener";
56

@@ -17,10 +18,8 @@ const sTable = css({
1718
});
1819

1920
export const PopupObs: Component = () => {
20-
// oxlint-disable-next-line init-declarations no-unassigned-vars
21-
let tableDiv!: HTMLDivElement;
22-
// oxlint-disable-next-line init-declarations no-unassigned-vars
23-
let outerTableDiv!: HTMLDivElement;
21+
const tableDiv = createComponentRef<HTMLDivElement>();
22+
const outerTableDiv = createComponentRef<HTMLDivElement>();
2423

2524
const { data } = useObsListener();
2625
const [scale, setScale] = createSignal(1);

src/domains/time-trial/components/time-trial-player.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { GridColumn } from "../../ui/components/grid/grid-column";
1010
import { ObsButton } from "../../obs/components/obs-button";
1111
import { PlaybackRateSelect } from "./playback-rate-select";
1212
import { PlayerInput } from "./player-input";
13+
import { createComponentRef } from "../../_core/utils/solid-js";
1314
import { css } from "@emotion/css";
1415
import { useSettingsRepository } from "../../database/compositions/use-settings-repository";
1516
import { useTimeTrial } from "../compositions/use-time-trial";
@@ -53,8 +54,7 @@ const sVideoCanvasItem = css({
5354
});
5455

5556
export const TimeTrialPlayer: Component = () => {
56-
// oxlint-disable-next-line init-declarations no-unassigned-vars
57-
let dialog!: DialogRef;
57+
const dialog = createComponentRef<DialogRef>();
5858

5959
const timeTrial = useTimeTrial();
6060
const settings = useSettingsRepository();

src/domains/ui/components/dialog/dialog.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { type Component, type JSX, type Ref, Show, onMount } from "solid-js";
22
import { DialogContent } from "./dialog-content";
33
import { DialogContext } from "./dialog-context";
44
import { Portal } from "solid-js/web";
5+
import { createComponentRef } from "../../../_core/utils/solid-js";
56
import { css } from "@emotion/css";
67
import { isFunction } from "remeda";
78

@@ -26,8 +27,7 @@ interface DialogProps {
2627
}
2728

2829
export const Dialog: Component<DialogProps> = (props) => {
29-
// oxlint-disable-next-line init-declarations no-unassigned-vars
30-
let dialog!: HTMLDialogElement;
30+
const dialog = createComponentRef<HTMLDialogElement>();
3131

3232
onMount(() => {
3333
if (isFunction(props.ref)) {

0 commit comments

Comments
 (0)