en
Feedback
ToCode

ToCode

Open in Telegram

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Show more
1 417
Subscribers
-224 hours
-37 days
-630 days
Posts Archive
ToCode
1 417
ื‘ื“ื•ื’ืžืื•ืช ืฉืœ ืจื™ืืงื˜ ื‘ืื•ืชื• ืขืžื•ื“ ื”ื ืžืจืื™ื ืื™ืš ืœื”ืฉืชืžืฉ ื‘ useDeferredValue ื’ื ืœืขื‘ื•ื“ื” ืขื ื‘ืงืฉื•ืช ืจืฉืช, ืื‘ืœ ืคื” ืฆืจื™ืš ืœื”ื“ื’ื™ืฉ ืฉืžื ื’ื ื•ืŸ ื–ื” ืœื ืžื•ื•ืกืช ืืช ื›ืžื•ืช ื”ืงืจื™ืื•ืช ืœืฉืจืช ืืœื ืจืง ืืช ืขื“ื›ื•ื ื™ ืžืžืฉืง ื”ืžืฉืชืžืฉ ื•ืœื›ืŸ ืœื ืžืกืคื™ืง ืœื‘ื“ื• ื›ื“ื™ ืœื•ื•ืกืช ืงื•ื“ ืชืงืฉื•ืจืช.

ToCode
1 417
ื”ืคืงื•ื“ื•ืช debounce ื• deferred ื‘ืจื™ืืงื˜ ื‘ื•ืื• ื ื“ื‘ืจ ืขืœ ืฉื ื™ ืžื ื’ื ื•ื ื™ื ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื™ืฉื•ืžื™ ืจื™ืืงื˜ ืขื ืกื™ื ื•ืŸ ืจืฉื™ืžื•ืช ื•ื ื‘ื™ืŸ ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ื ื™ื”ื ื•ืžืชื™ ื ืฉืชืžืฉ ื‘ื›ืœ ืื—ื“ (ืื• ื‘ืฉื ื™ื”ื ื™ื—ื“). ืขื“ื›ื•ืŸ ืขื Debounce ื‘ืจื™ืืงื˜ ื›ืฉื™ืฉ ืœื™ ืจืฉื™ืžื” ื’ื“ื•ืœื” ืฉืœ ืคืจื™ื˜ื™ื ื•ืื ื™ ืจื•ืฆื” ืœืกื ืŸ ืื•ืชื” ื”ืกื™ื ื•ืŸ ืขืฆืžื• ืขืœื•ืœ ืœื”ื™ื•ืช ืคืขื•ืœื” ื›ื‘ื“ื”. ื™ื•ืชืจ ืžื–ื”, ืื ื”ืกื™ื ื•ืŸ ืขืฆืžื• ื›ื•ืœืœ ื’ื™ืฉื” ืœืฉืจืช ื”ืคืขืœืช ื™ื•ืชืจ ืžื“ื™ ืคืขื•ืœื•ืช ืกื™ื ื•ืŸ ื™ื›ื•ืœื” ืœื™ืฆื•ืจ ืขื•ืžืก ืขืœ ื”ืฉืจืช. ืœื›ืŸ ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืžื ื’ื ื•ืŸ debounce ื›ื“ื™ ืœื™ื™ืฆื‘ ืืช ื”ืงืจื™ืื•ืช, ื›ืœื•ืžืจ ื ืจืฆื” ืœืฉืœื•ื— ืืช ื‘ืงืฉืช ื”ืกื™ื ื•ืŸ ืœืฉืจืช ืจืง ืื—ืจื™ ืฉื”ืžืฉืชืžืฉ ืกื™ื™ื ืจืฆืฃ ื”ืงืœื“ื•ืช. ื‘ื“ืจืš ื›ืœืœ debounce ืžืžื•ืžืฉ ืขืœ ื™ื“ื™ ื”ืžืชื ื” ืฉืœ ื—ืฆื™ ืฉื ื™ื” ืื• ืฉื ื™ื” ืžืจื’ืข ื”ืฉื™ื ื•ื™ ื”ืื—ืจื•ืŸ ื•ืขื“ ืœืจื’ืข ืฉื‘ืืžืช ืฉื•ืœื—ื™ื ืืช ื”ื•ื“ืขืช ื”ื—ื™ืคื•ืฉ ืœืฉืจืช. ืื ื‘ืžื”ืœืš ื”ื–ืžืŸ ื”ื–ื” ื”ืžืฉืชืžืฉ ืžืงืœื™ื“ ืžืฉื”ื• ื ื•ืกืฃ ืื– ื ืชื—ื™ืœ ืืช ื”ืกืคื™ืจื” ืžื—ื“ืฉ. ื”ืคื•ื ืงืฆื™ื” useDebounce ืžืชื•ืš ื”ืื•ืกืฃ useHooks ืžืžื•ืžืฉืช ื›ืš:
export function useDebounce(value, delay) {
  const [debouncedValue, setDebouncedValue] = React.useState(value);

  React.useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]);

  return debouncedValue;
}
ื”ื™ื ืœื•ืงื—ืช ืขืจืš ืฉื”ื•ื ืœืจื•ื‘ ืžืฉืชื ื” ืกื˜ื™ื™ื˜ ื›ืœืฉื”ื• ื•ืžืกืคืจ ืžื™ืœื™ ืฉื ื™ื•ืช ืœื”ืžืชื ื”. ื”ื™ื ืžื’ื“ื™ืจื” ืžืฉืชื ื” ืกื˜ื™ื™ื˜ ืคื ื™ืžื™ ื ื•ืกืฃ ืฉื™ืชืขื“ื›ืŸ ืจืง ืื—ืจื™ ืฉื”ืขืจืš ื”ืžืงื•ืจื™ ืœื ื”ืฉืชื ื” ื‘ืžืฉืš delay ืžื™ืœื™-ืฉื ื™ื•ืช. ื‘ืขื–ืจืช ืืคืงื˜ ื”ืคื•ื ืงืฆื™ื” ืžื’ื“ื™ืจื” timeout ื•ืžืืคืกืช ืืช ื”ืฉืขื•ืŸ ื›ืœ ืคืขื ืฉ value ืžืฉืชื ื”. ืื ื™ ืžืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” ื‘ืื•ืคืŸ ื”ื‘ื:
function TextWithDebounce() {
  const [text, setText] = useState('');
  const debouncedText = useDebounce(text, 1000);

  return (
    <>
      <input type="text" value={text} onChange={e => setText(e.target.value)} />
      <p>Character Count: {debouncedText.length}</p>
    </>
  )
}
ื”ืงื•ืžืคื•ื ื ื˜ื” ืชืฆื™ื’ ืชื™ื‘ืช ื˜ืงืกื˜ ื•ืจืง ืื—ืจื™ ืฉืžืฉืชืžืฉ ืžืคืกื™ืง ืœืขื“ื›ืŸ ืืช ื”ื˜ืงืกื˜ ื‘ืชื™ื‘ื” ื”ื™ื ืชืฆื™ื’ ืืช ืžืกืคืจ ื”ืชื•ื•ื™ื ืฉื”ื•ืงืœื“ื•. ืขื“ื›ื•ืŸ ืขื useDeferredValue ื‘ืจื™ืืงื˜ ื”ืคื•ื ืงืฆื™ื” useDeferredValue ื”ื™ื ื›ื‘ืจ ื—ืœืง ืžื•ื‘ื ื” ื‘ืจื™ืืงื˜ ื•ืžื˜ืจืชื” ืœื™ื™ืฆื‘ ืืช ืžืžืฉืง ื”ืžืฉืชืžืฉ ื‘ืืžืฆืขื•ืช ื”ืจืฆืช ืงื•ื“ ืจื™ืืงื˜ ื‘ืจืงืข. ืื ื™ ืืกื‘ื™ืจ: 1. ื›ืฉืจื™ืืงื˜ ืžื–ื”ื” ืฉื™ื ื•ื™ ื‘ืžืฉืชื ื” ืกื˜ื™ื™ื˜ ื”ื•ื ืžื™ื“ ืžืจื™ืฅ ืืช ืคื•ื ืงืฆื™ื™ืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื‘ื” ื ืžืฆื ืื•ืชื• ืžืฉืชื ื” ืกื˜ื™ื™ื˜, ื•ื‘ืขืงื‘ื•ืชื™ื” ืžืžืฉื™ืš ืœื—ืฉื‘ ืืช ื›ืœ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉื‘ืชื•ื›ื”, ื›ื“ื™ ืœื‘ื ื•ืช ืืช ื” Virtual DOM ื”ื—ื“ืฉ ืฉืžื•ืฉืคืข ืžื”ืฉื™ื ื•ื™. 2. ื”ืจืฆืช ืชื”ืœื™ืš ื”ื—ื™ืฉื•ื‘ ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืื™ื˜ื™ืช, ื•ื‘ื–ืžืŸ ื”ื–ื” ืžืžืฉืง ื”ืžืฉืชืžืฉ ืœื ืžืขื•ื“ื›ืŸ. ื™ื•ืชืจ ืžื–ื”, ื‘ืžื”ืœืš ืชื”ืœื™ืš ื”ื—ื™ืฉื•ื‘ ื™ื›ื•ืœื™ื ืœืงืจื•ืช ืื™ืจื•ืขื™ UI ื ื•ืกืคื™ื ืฉื™ื˜ื•ืคืœื• ื‘ืื™ื—ื•ืจ ื›ื™ ื”ื“ืคื“ืคืŸ ืขืกื•ืง ื‘ื—ื™ืฉื•ื‘ ื” Virtual DOM ืฉืœ ื”ืฉื™ื ื•ื™ ื”ืงื•ื“ื. ืคื•ื ืงืฆื™ื™ืช useDeferredValue ืžืฆื™ืขื” ืคืชื— ืžื™ืœื•ื˜ ืžื‘ืขื™ื” ื–ื• - ื”ื™ื ืžืืคืฉืจืช ืœื ื• ืœื”ืžืฉื™ืš ืœื”ืฆื™ื’ ืืช ื”ืขืจืš ื”ื™ืฉืŸ ื•ืœื—ืฉื‘ ืืช ื” Virtual DOM ื”ื—ื“ืฉ ื‘ืจืงืข. ืื ื™ื”ื™ื• ืื™ืจื•ืขื™ UI ื ื•ืกืคื™ื ืฉื™ืฉื ื• ืืช ื”ืกื˜ื™ื™ื˜ ืจื™ืืงื˜ ื™ื•ื›ืœ ืœืขืฆื•ืจ ืืช ื”ื—ื™ืฉื•ื‘ ื‘ืจืงืข ื•ืœื”ืชื—ื™ืœ ื—ื™ืฉื•ื‘ ืžื—ื“ืฉ ืขื ื”ืขืจืš ื”ื—ื“ืฉ, ื›ืœ ื–ืืช ื‘ืœื™ ืœืคื’ื•ืข ื‘ืžื™ื“ืข ืฉืžื•ืฆื’ ืขืœ ื”ืžืกืš. ืจืง ืื—ืจื™ ืฉื”ื—ื™ืฉื•ื‘ ื‘ืจืงืข ื™ืกืชื™ื™ื ืจื™ืืงื˜ ื™ื—ืœื™ืฃ ืืช ื”ืชื•ื›ืŸ ืฉืขืœ ื”ืžืกืš "ื‘ืžื›ื” ืื—ืช" ื‘ืœื™ ืœืคื’ื•ืข ื‘ื—ื•ื•ื™ืช ื”ืžืฉืชืžืฉ. ื ืชื‘ื•ื ืŸ ื‘ื“ื•ื’ืžืช ื”ืงื•ื“ ื”ื‘ืื” ืžื“ืฃ ื”ืชื™ืขื•ื“ ืฉืœ ื”ืคื•ื ืงืฆื™ื”:
import { useState, useDeferredValue } from 'react';
import SlowList from './SlowList.js';

export default function App() {
  const [text, setText] = useState('');
  const deferredText = useDeferredValue(text);
  return (
    <>
      <input value={text} onChange={e => setText(e.target.value)} />
      <SlowList text={deferredText} />
    </>
  );
}
ื‘ื”ื ื—ื” ืฉืœื•ืงื— ื”ืจื‘ื” ื–ืžืŸ ืœื‘ื ื•ืช ืืช SlowList ืขื‘ื•ืจ ื˜ืงืกื˜ ืžืกื•ื™ื, ื”ืฉื™ืžื•ืฉ ื‘ deferredValue ืžืืคืฉืจ ืœืจื™ืืงื˜ ืœื”ื’ื™ื‘ ืœืฉื™ื ื•ื™ื™ื ื‘ text ืžื™ื“ ื›ืฉื”ื ืงื•ืจื™ื ื•ืœื”ืจื™ืฅ ืืช ื”ื—ื™ืฉื•ื‘ ืฉืœ SlowList ื‘ืจืงืข. ืื ื”ื—ื™ืฉื•ื‘ ืžืกืชื™ื™ื ื• text ืœื ื”ืฉืชื ื” ืื– ื‘ืžื›ื” ืื—ืช ื”ืขืจืš ืฉืœ deferredText ื™ื•ื—ืœืฃ ืœืขืจืš ื”ื—ื“ืฉ ืฉืœ text ื•ืจื™ืืงื˜ ื™ืฉืชืžืฉ ื‘ Virtual DOM ืฉื”ื•ื ื›ื‘ืจ ื—ื™ืฉื‘. ืื text ืžืฉืชื ื” ื‘ืืžืฆืข ื”ื—ื™ืฉื•ื‘ ืื– ืจื™ืืงื˜ ืคืฉื•ื˜ ื™ืขืฆื•ืจ ืืช ื”ื—ื™ืฉื•ื‘ ื”ืงื•ื“ื ื•ื™ืชื—ื™ืœ ืœื—ืฉื‘ ืžื—ื“ืฉ ืืช SlowList ืขื ื”ื˜ืงืกื˜ ื”ื—ื“ืฉ. ื .ื‘. ื‘ืฉื‘ื™ืœ ืฉื“ื•ื’ืžื” ื–ื• ืชืขื‘ื•ื“ SlowList ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžื•ื’ื“ืจ ืขื memo ื›ื™ ื›ืฉ text ืžืฉืชื ื” ืจื™ืืงื˜ ืžื ืกื” ืœื—ืฉื‘ ืžื—ื“ืฉ ืืช App ื•ื‘ืœื™ memo ื’ื ืื deferredText ืœื ืžืฉืชื ื” ืขื“ื™ื™ืŸ ืจื™ืืงื˜ ื™ืฆื˜ืจืš ืœื—ืฉื‘ ืžื—ื“ืฉ ืืช SlowList.

ToCode
1 417
ื”ืฆืขื” ืœืคืจื•ืžืคื˜ - ืื™ืš ืœืฉื‘ื•ืจ ืืช ื”ืงื•ื“ ืื—ื“ ื”ืงืฉื™ื™ื ืฉืœ ืžืชื›ื ืชื™ื, ื‘ืžื™ื•ื—ื“ ื‘ืขื•ืœื ืฉืœ ืื‘ื˜ื—ืช ืžื™ื“ืข ืื‘ืœ ื’ื ืžื—ื•ืฅ, ื”ื•ื ืœืจืื•ืช ื‘ืื’ ื‘ืงื•ื“ ืฉืœื ื’ื•ืจื ืœื‘ืขื™ื” ื‘ื”ืชื ื”ื’ื•ืช ื”ืžืขืจื›ืช. ื‘ืื’ ืฉืžืกืชืชืจ ื•ืžื—ื›ื” ืœืคื™ืฆ'ืจ ื—ื“ืฉ ืฉื ืจืฆื” ืœื”ื•ืกื™ืฃ ื•ืื– ืคืชืื•ื ื™ื•ืคื™ืข ื•ื›ื•ืœื ื• ื ืฉืืœ "ืื‘ืœ ืื™ืš ื–ื” ืขื‘ื“ ืขื“ ืขื›ืฉื™ื•?". ืื– ื”ื ื” ื”ืฆืขื” ืœืคืขื ื”ื‘ืื” ืฉืืชื ืžืงืฉืงืฉื™ื ืขื ืงืœื•ื“ ืื• ื—ื‘ืจ ืื—ืจ, ื–ื” ื”ื•ืœืš ื›ื›ื”: > Let's play a game - the code below has a hidden bug, but it will be triggered if we add a specific feature. What new feature will break this code? ืื ื™ ื ืชืชื™ ืœื• ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ืืช ื”ืงื•ื“ ืจื™ืืงื˜ ื”ื–ื” ื•ื”ื•ื ืงืœืข ื‘ื•ืœ ืœืคื™ืฆ'ืจ ืฉื”ื™ื” ืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืืช ื”ื‘ืื’:
function ColorPalette({ start }: {
  start: ColorInput,
}) {
  const [deletedBoxes, setDeletedBoxes] = useState(new Set());

  const removeBox = useCallback((e: React.MouseEvent) => {
    console.log(\deleted boxes = ${deletedBoxes.size}\);
    
    const id = (e.target as HTMLDivElement).dataset.id;
    deletedBoxes.add(Number(id));
    setDeletedBoxes(new Set(deletedBoxes));
  }, [deletedBoxes, setDeletedBoxes]);

  const colors = [];
  for (let i=-360; i < 360; i++) {
    if (deletedBoxes.has(i)) continue;

    colors.push(
      <ColorBox
        key={i}
        start={start}
        spin={i}
        onClick={removeBox}
        id={i}
      />
    );
  }
  return colors;
}
(ื•ื›ืŸ ื›ื ืจืื” ืฉืืคืฉืจ ืœื”ื•ืจื™ื“ ืืช ื”ืชื—ื™ืœื™ืช Let's play a game, ืื‘ืœ ืื ื™ ืžื•ืฆื ืฉื”ืชืฉื•ื‘ื•ืช ืฉืœ AI ื™ื•ืชืจ ื ื—ืžื“ื•ืช ื›ืฉื”ื•ื ื—ื•ืฉื‘ ืฉื”ื•ื ื‘ืžืฉื—ืง).

ToCode
1 417
ื•ืื ื”ืžื™ื“ืœื•ื•ืจ ืœื ื™ืจื•ืฅ? ื‘ืื’ ืžืขื ื™ื™ืŸ ื‘ืžื ื’ื ื•ืŸ ื”ืžื™ื“ืœื•ื•ืจื™ื ืฉืœ next.js ืื™ืคืฉืจ ืœืชื•ืงืคื™ื ืœื“ืœื’ ืขืœ ื”ืžื™ื“ืœื•ื•ืจ ื‘ืืžืฆืขื•ืช ื”ื–ืจืงืช ื›ื•ืชืจืช ืžื™ื•ื—ื“ืช ืœื‘ืงืฉื”. ืœื ื ื™ื›ื ืก ืœืคืจื˜ื™ื ื”ื˜ื›ื ื™ื™ื ืื‘ืœ ื›ืŸ ืฉื•ื•ื” ืœืฉื™ื ืœื‘ ืœืกื™ืคื•ืจ ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ืื‘ื˜ื—ืช ืžื™ื“ืข. ื‘ื™ื™ืฉื•ืžื™ื ืจื‘ื™ื ืžื ื’ื ื•ืŸ ื ื™ื”ื•ืœ ื”ืžืฉืชืžืฉื™ื ื•ื—ืกื™ืžืช ื’ื™ืฉื” ืœื ืชื™ื‘ื™ื ืžืกื•ื™ืžื™ื ืžืชื‘ืฆืข ื‘ืžื™ื“ืœื•ื•ืจ, ืœืคื ื™ ืฉื”ื‘ืงืฉื” ืžื’ื™ืขื” ืœืงื•ื“ ืฉืื—ืจืื™ ืขืœ ื”ื˜ื™ืคื•ืœ ื‘ื”. ื™ืฉ ืคื” ืจืื™ื™ื” ืืจื›ื™ื˜ืงื˜ื•ื ื™ืช ืฉืœ ื”ืคืจื“ื” ื‘ื™ืŸ ื”ืงื•ื“ "ืฉืžื ื”ืœ ื’ื™ืฉื”" ืœืงื•ื“ "ืฉืžื‘ืฆืข ืืช ื”ืคืขื•ืœื”". ืœื“ื•ื’ืžื” ื‘ืžื“ืจื™ืš ืฉืœ auth0-next ืžืฆืืชื™ ืืช ื”ื‘ืœื•ืง ื”ื‘ื:
import { withMiddlewareAuthRequired } from "@auth0/nextjs-auth0/edge";

export default withMiddlewareAuthRequired();

export const config = {
  matcher: ["/protected", "/admin"],
};
ื”ืงื•ื“ ืžื’ื“ื™ืจ ืฉื’ื™ืฉื” ืœื ืชื™ื‘ื™ protected ื• admin ืžื•ืชืจืช ืจืง ืœืžืฉืชืžืฉื™ื ืžืื•ืžืชื™ื. ืืชื ืจื•ืื™ื ืืช ื”ื‘ืขื™ื” ื ื›ื•ืŸ? ืื ื”ืžื™ื“ืœื•ื•ืจ ืœื ืจืฅ ื”ื’ื™ืฉื” ืคืชื•ื—ื” ืœื›ื•ืœื. ื ืฉื•ื•ื” ืืช ื–ื” ืœืขื™ืงืจื•ืŸ "ื‘ื•ื“ืงื™ื ืฆืžื•ื“ ืœืคืขื•ืœื” ื”ืžืกื•ื›ื ืช" ืฉืœ ืคื™ืชื•ื— ืงื•ื“ ืžืื•ื‘ื˜ื—. ื‘ืขื‘ื•ื“ื” ื ื›ื•ื ื” ืื ื—ื ื• ืจื•ืฆื™ื ืœื‘ื“ื•ืง ื”ืจืฉืื•ืช ื‘ืชื•ืš ื“ืฃ ื” admin, ื•ืืคื™ืœื• ื‘ืชื•ืš ื”ืคื•ื ืงืฆื™ื” ืฉืžื•ืฉื›ืช ืžื™ื“ืข ืฉืœ ืžื ื”ืœ ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ืฉื™ืžื• ืœื‘ ืœืžื™ืžื•ืฉ ื”ื“ื•ื’ืžื” ื”ื‘ื ืžืชื•ืš ืื•ืชื• ืžื“ืจื™ืš:
export const getUserProfileData = async (): Promise<Claims> => {
  const session = await getSession();

  if (!session) {
    throw new Error(\Requires authentication\);
  }

  const { user } = session;

  return user;
};
ืคื•ื ืงืฆื™ื” ื›ื–ืืช ืœื ืชืืคืฉืจ ืœืžืฉื•ืš ื ืชื•ื ื™ื ืจื’ื™ืฉื™ื, ืืคื™ืœื• ืื ื›ืœ ื”ืงื•ื“ ืฉืœืคื ื™ื” ื‘ื•ื˜ืœ. ื”ื™ื ื‘ืขืฆืžื” ืœื•ืงื—ืช ืืช ื ืชื•ื ื™ ื”ืžืฉืชืžืฉ ื•ืžื•ื•ื“ืืช ืฉื”ืžืฉืชืžืฉ ืžื—ื•ื‘ืจ. ื‘ืžืขืจื›ืช ืขื ืžื ื’ื ื•ืŸ ื”ืจืฉืื•ืช ืคื•ื ืงืฆื™ื” ื–ื• ืชื•ื›ืœ ื’ื ืœื•ื•ื“ื ืฉืœืžืฉืชืžืฉ ืฉืžื—ื•ื‘ืจ ื™ืฉ ื”ืจืฉืื•ืช ืœื‘ืฆืข ืืช ื”ืคืขื•ืœื” ืฉื”ื™ื ืจื•ืฆื” ืœื‘ืฆืข, ื•ืจืง ืื– ืชืจื™ืฅ ืืช ื”ืงื•ื“ ื”ืžืกื•ื›ืŸ. ืงื•ื“ ืžืื•ื‘ื˜ื— ืœื ืžื ื™ื— ืฉืžื™ืฉื”ื• ืœืคื ื™ื• ื‘ื“ืง ื”ืจืฉืื•ืช - ื”ื•ื ื‘ื•ื“ืง ื”ืจืฉืื•ืช ืฆืžื•ื“ ื•ื‘ื“ื™ื•ืง ืœืคื ื™ ื”ืคืขื•ืœื” ื”ืžืกื•ื›ื ืช, ื›ื“ื™ ืฉืื™ ืืคืฉืจ ื™ื”ื™ื” "ืœื“ืœื’" ืขืœ ื‘ื“ื™ืงืช ื”ื”ืจืฉืื•ืช ื•ืœื”ื’ื™ืข ืจืง ืœืงื•ื“ ื”ืจื’ื™ืฉ.

ToCode
1 417
ื˜ื™ืค JavaScript - ืฉื™ืžื•ืฉ ื‘ matchMedia ื‘ืžืงื•ื resize ืคืงื•ื“ืช matchMedia ื”ื™ื ื˜ืจื™ืง ื—ืžื•ื“ ืฉืžืืคืฉืจ ืœื ื• ืœืงื‘ืœ ืื™ืจื•ืข ื›ืœ ืคืขื ืฉ"ื”ืชืืžืช ื”ืžืกืš ืœ Media Query" ืžืกื•ื™ื ืžืฉืชื ื”. ื–ื” ืžื ื’ื ื•ืŸ ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœ ืžืื™ืจื•ืขื™ resize ื›ื™ ืจื•ื‘ ื”ื–ืžืŸ ืžื” ืฉืžืขื ื™ื™ืŸ ืื•ืชื ื• ื–ื” ืœื ืฉืžืฉืชืžืฉ ืฉื™ื ื” ืืช ื’ื•ื“ืœ ื”ื—ืœื•ืŸ ืืœื ืฉื’ื•ื“ืœ ื”ื—ืœื•ืŸ ื ื”ื™ื” ืžืกืคื™ืง ืงื˜ืŸ ื›ื“ื™ ืœื”ืชื™ื—ืก ืืœื™ื• ื›ืžื• ืœื˜ืœืคื•ืŸ, ืื• ืžืกืคื™ืง ื’ื“ื•ืœ ื›ื“ื™ ืœื”ืฆื™ื’ ืขืœื™ื• ื™ื•ืชืจ ืžื™ื“ืข. ื–ืืช ื‘ืขืฆื ื’ื™ืจืกืช ื” JavaScript ืฉืœ Media Queries ื‘ CSS. ื”ื ื” ื“ื•ื’ืžื” ืงืฆืจื” ืœ Hook ืจื™ืืงื˜ื™ ืฉื‘ื•ื“ืง ืื ืื ื—ื ื• ืขืœ ืžื›ืฉื™ืจ ืžื•ื‘ื™ื™ืœ:

const MOBILE_BREAKPOINT = 768

export function useIsMobile() {
  const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)

  React.useEffect(() => {
    const mql = window.matchMedia(\(max-width: ${MOBILE_BREAKPOINT - 1}px)\)
    const onChange = () => {
      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
    }
    mql.addEventListener("change", onChange)
    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
    return () => mql.removeEventListener("change", onChange)
  }, [])

  return !!isMobile
}

ToCode
1 417
ื›ืœื™ื ืฉืงื•ืคื™ื ืื ื”ืขืชื™ื“ ืฉืœื ื• ื”ื•ื ืขื•ื–ืจื™ AI ืœื›ืชื™ื‘ืช ืงื•ื“ ืื– ื›ื“ืื™ ืฉื ื—ืฉื•ื‘ ืฉื•ื‘ ืขืœ ืฉืคื•ืช ื”ืคื™ืชื•ื— ื•ื”ืกืคืจื™ื•ืช ื‘ื”ื ืื ื—ื ื• ืžืฉืชืžืฉื™ื. ื”ื ื” ื›ืžื” ื“ื‘ืจื™ื ืฉืœืžื“ืชื™ ื‘ืžืฉื—ืงื™ื ืขื AI ื‘ืฉื‘ื•ืข ื”ืื—ืจื•ืŸ: 1. ืžืื•ื“ ืงืœ ืœื• ืœื›ืชื•ื‘ ืžืฉื—ืง ืกื ื™ื™ืง, ืžืื•ื“ ืงืฉื” ืœื”ืฉืชืžืฉ ื ื›ื•ืŸ ื‘ืกืคืจื™ื•ืช ืž npm. ื–ื” ืงื•ืจื” ื›ื™ ืžืฉื—ืง ืกื ื™ื™ืง ืžืฉืชืžืฉ ืจืง ื‘ื™ื›ื•ืœื•ืช ืฉืœ ื”ื“ืคื“ืคืŸ ื›ืœื•ืžืจ ืžื™ื“ืข ืฉื”ื•ื ื”ืชืืžืŸ ืขืœื™ื•, ื•ืื™ืœื• ืกืคืจื™ื•ืช ื‘ npm ืžืฉื ื•ืช ืืช ื”ืžืžืฉืง ื›ืœ ืฉืœื•ืฉื” ื—ื•ื“ืฉื™ื ื•ืœื›ืŸ ื™ืฉ ื™ื•ืชืจ ืžื“ื™ ืงื•ื ื˜ืงืกื˜. 2. ืžืื•ื“ ืงืœ ืœื• ืœื›ืชื•ื‘ ืฉืื™ืœืชืช SQL, ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ืœื›ืชื•ื‘ ืงื•ื“ ORM. 3. ืžืื•ื“ ืงืœ ืœื• ืœื›ืชื•ื‘ ืชื‘ื ื™ืช SAM ืœืืจื›ื™ื˜ืงื˜ื•ืจืช Serverless ืขืœ AWS, ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ืœื• ืœืชืงืŸ ืกืงืจื™ืคื˜ ื”ืชืงื ื” ืœืฉืจืช VPC. 4. ืžืื•ื“ ืงืœ ืœื• ืœื›ืชื•ื‘ ืขืžื•ื“ ื—ื“ืฉ ืœืืชืจ, ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ื›ืฉื”ืขืžื•ื“ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืงื•ืžืคื•ื ื ื˜ื•ืช ืงื™ื™ืžื•ืช ืžื”ืžืขืจื›ืช ืฉืื•ืœื™ ืœื ืžืชื•ืขื“ื•ืช ืžืกืคื™ืง ื˜ื•ื‘. 5. ืžืื•ื“ ืงืœ ืœื• ืœื›ืชื•ื‘ ื‘ื“ื™ืงืช End To End ืœืคื™ ืจืฉื™ืžืช ืชืจื—ื™ืฉื™ื ืฉืื ื™ ืžืชืืจ, ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ืœื”ืงื™ื ืชืฉืชื™ืช ืœื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ื•ืœื”ื—ืœื™ื˜ ืื™ื–ื” Mock-ื™ื ืœืขืฉื•ืช ื•ืื™ืš ืฆืจื™ืš ืœืืจื’ืŸ ืื—ืจืช ืืช ื”ืงื•ื“ ื”ืกืคืฆื™ืคื™ ืฉืœื™ ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœื›ืชื•ื‘ ืื•ืชื•. ืžื” ืฉืžืฉื•ืชืฃ ืœื›ืœ ื”ืžืงืจื™ื ื›ืืŸ, ื•ืœืขื‘ื•ื“ื” ืขื AI ื‘ืื•ืคืŸ ื›ืœืœื™ ื”ื•ื ื”ืงื• ืฉื‘ื™ืŸ ื”ืกืคืฆื™ืคื™ ืœื›ืœืœื™ - ื›ื›ืœ ืฉืžื“ื•ื‘ืจ ื‘ืœืงื—ืช "ืงื•ื“ ืžืกืคืจ ืœื™ืžื•ื“" ื•ืœื”ื“ื‘ื™ืง ืื•ืชื• ืœืคืจื•ื™ืงื˜ ืชื•ืš ื‘ื™ืฆื•ืข ื”ืชืืžื•ืช ื ื“ืจืฉื•ืช ื“ื‘ืจื™ื ื™ืขื‘ื“ื• ื•ื™ืคืชื™ืขื• ืœื˜ื•ื‘ื”. ื‘ืจื’ืข ืฉืื ื—ื ื• ืžื’ื™ืขื™ื ืœ Refactoring ืื• ืœืงื‘ืœืช ื”ื—ืœื˜ื•ืช ื”ืขืกืง ืžืกืชื‘ืš. ื–ื” ืื•ืžืจ ืฉืื ืื ื—ื ื• ืจื•ืฆื™ื ืœื”ืจื•ื•ื™ื— ืž AI ื›ื“ืื™ ืœื—ืคืฉ ืืช ื”ืžืงื•ืžื•ืช ื‘ื”ื ื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜ ืงื˜ืŸ (ืฆืจื™ืš ืคื—ื•ืช ื˜ื•ืงื ื™ื ื‘ืงืœื˜ ื›ื“ื™ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื”) ื•ื”ืžืฉืžืขื•ืช ืฉืœ ื”ื˜ื•ืงื ื™ื ื™ืฆื™ื‘ื”. ืื– SQL ื–ื” ืžืฆื•ื™ืŸ ื›ื™ ื›ืžื• ืฉื›ืชื‘ืชื™ ืืช ื”ืฉืื™ืœืชื” ื›ื›ื” ื”ื™ื ื”ื•ืœื›ืช ืœ DB, ื• ORM ื–ื” ืžืกื•ื‘ืš ื›ื™ ื”ื’ื“ืจื•ืช ื”ืงืฉืจื™ื ื‘ื™ืŸ ื”ืžื•ื“ืœื™ื ืžืžื•ืงืžื•ืช ื‘ืงื•ื‘ืฅ ื ืคืจื“ ืื• ื›ืžื” ืงื‘ืฆื™ื ืื• ืฉื™ืœื•ื‘ ื‘ื™ืŸ ืงื‘ืฆื™ื ืœ DB. ืจื•ืฆื™ื ืœื”ืจื•ื•ื™ื— ืž AI? ื ืกื• ืœื”ื–ื™ื– ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœื›ื ืœื›ื™ื•ื•ืŸ ื›ืœื™ื ืฉืงื•ืคื™ื ื•ืกื˜ื ื“ืจื˜ื™ื™ื. ืื‘ืกื˜ืจืงืฆื™ื•ืช ืžืชื•ื—ื›ืžื•ืช ื•ืกืคืฆื™ืคื™ื•ืช ืœืžืขืจื›ืช ืฉืœื ื• ื™ื•ืฆืจื•ืช ืขื›ืฉื™ื• ืขืœื•ืช ื—ื“ืฉื” ื•ืื•ืœื™ ืœื ืฉื•ื•ื•ืช ืืช ื”ืžืืžืฅ.

ToCode
1 417
ืชื‘ื ื™ืช ืœืคื™ืชื•ื— Chat Bot ื‘ Next.JS ืœื ืžืฉื ื” ื›ืžื” ื—ืฉื‘ืชื ืฉืœื›ื ืงืฉื” ืขื ื›ืœ ื”ืกืคืจื™ื•ืช ืฉืžืฉืชื ื•ืช ื›ืœ ื”ื–ืžืŸ ื‘ืขื•ืœื ื” Full Stack, ืœ AI ื–ื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื”. ืื•ืœื™ ื‘ื’ืœืœ ื–ื” ื”ื ืžืฆืœื™ื—ื™ื ืœื‘ื ื•ืช ืžืฉื—ืง ืกื ื™ื™ืง ื‘ืคื—ื•ืช ืžื“ืงื”, ืื‘ืœ ืจืง ื ื ืกื” ืžืฉื”ื• ืฉืฆืจื™ืš ืกืคืจื™ื•ืช ืž npm ื•ื”ื•ื ื”ื•ืœืš ืœืื™ื‘ื•ื“ ื‘ื’ื™ืจืกืื•ืช. ื•ื–ื” ื—ื‘ืœ ื›ื™ ืขื“ื™ื™ืŸ ื™ืฉ ื”ืžื•ืŸ ื“ื‘ืจื™ื ื‘ npm ืฉื™ื›ื•ืœื™ื ืœื—ืกื•ืš ืœื ื• ื–ืžืŸ ืคื™ืชื•ื— ื•ื‘ืื’ื™ื. ื”ื“ื•ื’ืžื” ืฉืœื ื• ื”ื™ื•ื ื”ื™ื ืกืคืจื™ื•ืช ื” ai ืฉืœ Vercel. ืžื” ื™ืฉ ื‘ื–ื” ื•ืจืกืœ ืคื™ืชื—ื• ืื•ืกืฃ ืกืคืจื™ื•ืช ืฉืžื—ื‘ืจื•ืช ื‘ื™ืŸ AI Bots ืœืžืžืฉืง ืžืฉืชืžืฉ, ื›ืš ืฉืžืฆื“ ืื—ื“ ืชื•ื›ืœื• ืœื›ืชื•ื‘ ืืช ื”ืžืžืฉืง ื‘ื›ืœ ื“ืจืš ืฉืชืจืฆื• ืื‘ืœ ืžืฆื“ ืฉื ื™ ืชืงื‘ืœื• ื’ื™ืฉื” ืœื›ืœ ื”ืคื™ื ื•ืงื™ื ื”ืกื˜ื ื“ืจื˜ื™ื™ื ืฉืœ ืžืžืฉืงื™ AI. ื‘ื“ื•ื’ืžื” ืฉืœ ืฆ'ื˜ ื‘ื•ื˜ ื–ื” ืื•ืžืจ ืฉื ืงื‘ืœ: 1. ืžืžืฉืง ืื—ื™ื“ ืœืฉืœื™ื—ืช ื”ื•ื“ืขื” ืœ AI Chat Bot. 2. ื”ื•ื“ืขื” ืฉืชื™ืฉืœื— ื‘ืžืžืฉืง ื”ืื—ื™ื“ ืชื•ื›ืœ ืœื—ื–ื•ืจ ื‘ืชื•ืจ ื–ืจื ืฉืœ ืชื•ื•ื™ื, ื•ื›ืš ืชื•ืฆื’ ืžื”ืจ ื™ื•ืชืจ ืœืžืฉืชืžืฉื™ื. 3. ืฉื™ืžื•ืฉ ื‘ื›ืœื™ื ื•ืžืžืฉืง ืกื˜ื ื“ืจื˜ื™ ืœื”ื•ื“ืขื•ืช ืฉื ื•ืฆืจื• ืขืœ ื™ื“ื™ ื›ืœื™ื. 4. ื”ืชืืžืช ื”ื•ื“ืขื•ืช ืœืกื›ื™ืžื” ื›ื“ื™ ืœื•ื•ื“ื ืฉืžืงื‘ืœื™ื ืืช ื”ืžื™ื“ืข ืฉืจืฆื™ื ื• ื•ื‘ืคื•ืจืžื˜ ืฉืจืฆื™ื ื•. ื‘ื•ืื• ื ืจืื” ืืช ื”ืชื‘ื ื™ืช ืœืคื™ืชื•ื— Chat Bot ื‘ืกื™ืกื™ ื•ื‘ืกื•ืฃ ืงื™ืฉื•ืจ ืœืชื™ืขื•ื“ ื›ื“ื™ ืฉืชื•ื›ืœื• ืœื”ืžืฉื™ืš ืžืฉื. ืฆ'ื˜ ื‘ื•ื˜ ื‘ืกื™ืกื™ ื‘ Next.JS ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช Chat Bot ื‘ืกื™ืกื™ ื‘ Next.JS ืขื ื”ื—ื‘ื™ืœื” ืฉืœ ื•ืจืกืœ ืชื—ื™ืœื” ื ืชืงื™ืŸ ืืช ื”ื—ื‘ื™ืœื” ืขื:
$ npm add ai ai-sdk/react
ื•ืœืื—ืจ ืžื›ืŸ ื ื•ืกื™ืฃ ืกืคืง AI ืฉื–ื” ืžื•ื“ื•ืœ ืœืขื‘ื•ื“ื” ืขื ืฆ'ื˜ ื‘ื•ื˜ ืžืกื•ื™ื, ื”ื ื” ื›ืžื” ืกืคืงื™ื ืœื“ื•ื’ืžื” (ืžืกืคื™ืง ืœื‘ื—ื•ืจ ืื—ื“):
$ npm add @ai-sdk/xai @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/google
ืžื‘ื—ื™ื ืช ื”ืงื•ื“ ื™ืฉ ืœืคืจื•ื™ืงื˜ ื‘ืกืš ื”ื›ืœ ืฉื ื™ ืงื‘ืฆื™ื. ืงื•ื“ ืฆื“ ืœืงื•ื— ืฉืžืฆื™ื’ ื—ืœื•ืŸ ืฉื™ื—ื”:
// file: page.tsx

'use client';

import { useChat } from '@ai-sdk/react';

export default function Page() {
  const { messages, input, handleInputChange, handleSubmit } = useChat({});

  return (
    <>
      {messages.map(message => (
        <div key={message.id}>
          {message.role === 'user' ? 'User: ' : 'AI: '}
          {message.content}
        </div>
      ))}

      <form onSubmit={handleSubmit}>
        <input name="prompt" value={input} onChange={handleInputChange} />
        <button type="submit">Submit</button>
      </form>
    </>
  );
}
ื•ืงื•ื“ ืฆื“ ืฉืจืช ืฉืžื˜ืคืœ ื‘ืคื ื™ื•ืช ืžื”ืœืงื•ื—, ืžืขื‘ื™ืจ ืืช ื”ื”ื•ื“ืขื” ืœื‘ื•ื˜ ื”ืฉื™ื—ื” ื•ืžื—ื–ื™ืจ ืืช ื”ืฉื™ื—ื” ื‘ื–ืจื ืชื•ื•ื™ื:
// src/app/api/chat/route.ts

import { deepseek } from '@ai-sdk/deepseek';
import { streamText } from 'ai';

// Allow streaming responses up to 30 seconds
export const maxDuration = 30;

export async function POST(req: Request) {
  const { messages } = await req.json();

  const result = streamText({
    model: deepseek('deepseek-chat'),
    system: 'You are a helpful assistant.',
    messages,
  });

  return result.toDataStreamResponse();
}
ืงื•ื“? ื‘ื˜ื— ื”ื ื” ื–ื” ื›ืืŸ: https://github.com/ynonp/nextjs-chatbot

ToCode
1 417
ืžื—ื–ื™ืง ืืฆื‘ืขื•ืช ื”ื—ื•ื•ื™ื” ื”ื›ื™ ืžืฉืžืขื•ืชื™ืช ืฉืœื™ ื‘ืขื‘ื•ื“ื” ืขื ื›ืœื™ AI. ืžื—ื–ื™ืง ืืฆื‘ืขื•ืช. ืื ื™ ื›ื•ืชื‘ ืคืจื•ืžืคื˜, ื•ืื– ืžื—ื–ื™ืง ืืฆื‘ืขื•ืช ืฉื”ืชืฉื•ื‘ื” ืชื”ื™ื” ื›ืžื• ืฉืจืฆื™ืชื™. ื”ื”ืžืชื ื” ืœืชืฉื•ื‘ื” ื”ื™ื ื—ืœืง ืžื”ืงืกื, ืืชื” ื™ื•ื“ืข ืฉื” AI ื™ื‘ื•ื ืขื ืชืฉื•ื‘ื”, ื•ืฉื–ื” ื™ื”ื™ื” ืงืฆืช ื™ื•ืชืจ ืžื”ืจ ืžืžื” ืฉืืชื” ืชืžืฆื ืืช ื”ืชืฉื•ื‘ื” ืœื‘ื“. ืื– ืื•ืœื™ ืฉื•ื•ื” ืœื—ื›ื•ืช. ื•ืื ื”ื•ื ืฆื•ื“ืง ื–ืืช ืžืžืฉ ื—ื’ื™ื’ื”. ืื‘ืœ ื›ืฉื”ื•ื ื˜ื•ืขื”? ื›ืฉื”ื•ื ื˜ื•ืขื” ืฆืจื™ืš ืœื‘ื—ื•ืจ, ื”ืื ืœืฉืื•ืœ ืฉืืœืช ื”ืžืฉืš, ืœื”ืชื—ื™ืœ ืžื”ื”ืชื—ืœื” ืื• ืœืจื“ืช ืžื–ื” ื•ืœื—ืฉื•ื‘ ืœื‘ื“. ืฉืืœืช ื”ืžืฉืš ื™ื›ื•ืœื” ืœื”ืฆืœื™ื—, ืœื”ืชื—ื™ืœ ืžื—ื“ืฉ ืขื ืคืจื•ืžืคื˜ ื—ื“ืฉ ื’ื ื™ื›ื•ืœ ืœืขื‘ื•ื“, ื•ืœื—ืฉื•ื‘ ืœื‘ื“? ืขื“ ืฉื”ื’ืขื ื• ืขื“ ืœืคื”. ื•ืื– ืื ื™ ื ื›ื ืก ืœืœื•ืค - ืคืจื•ืžืคื˜, ืชืฉื•ื‘ื” ืœื ืืคื•ื™ื”, ืชื™ืงื•ืŸ. ืคืจื•ืžืคื˜, ื”ืžื•ืŸ ืงื•ื“ ื’ืจื•ืข ืฉืœื ืขื•ื‘ื“, ืคืจื•ืžืคื˜ ื”ืžืฉืš ืขื ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”. ื•ืฉื•ื‘. ื•ืฉื•ื‘. ื™ืฉ ืœื™ ื—ื‘ืจ ืฉื›ืœ ืคืขื ืฉืื ื™ ืžืฆื™ืข ืœื• ืกืคืจื™ื™ืช ืงื•ื“ ืคืชื•ื— ืฉื‘ื“ื™ื•ืง ืชืคืชื•ืจ ืœื• ืื™ื–ื” ื‘ืขื™ื” ืกืคืฆื™ืคื™ืช ื”ื•ื ืžืกืชื›ืœ ืขืœื™ื™ ืžืœืžืขืœื” ื•ืžืกื ืŸ "ืขื–ื•ื‘ ืื•ืชืš, ืขื“ ืฉืื ื™ ืื‘ื™ืŸ ืื™ืš ื–ื” ืขื•ื‘ื“ ืื ื™ ื›ื‘ืจ ืื›ืชื•ื‘ ืœื‘ื“ ืžืฉื”ื• ื™ื•ืชืจ ื˜ื•ื‘". ื•ื‘ืืžืช ืœืงื— ืœื ื• ื”ืžื•ืŸ ื–ืžืŸ ืœืคืชื— ืชื™ืขื•ื“ ืžืกืคื™ืง ื˜ื•ื‘ ืœืกืคืจื™ื•ืช ืงื•ื“ ืคืชื•ื— ื•ืื™ื ื˜ื•ืื™ืฆื™ื” ืžืกืคื™ืง ื˜ื•ื‘ื” ืœื’ื‘ื™ ืžืชื™ ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ื”ืŸ (ื•ืื ื—ื ื• ืขื“ื™ื™ืŸ ืžืชืงืฉื™ื ืขื ื–ื”). ืื•ืœื™ ื’ื ืœ AI ืฆืจื™ืš ืœืชืช ื–ืžืŸ. ื›ืจื’ืข ื”ืจื•ืฉื ื”ื•ื ืฉื™ืฉ ื“ื‘ืจื™ื ืฉืขื•ื‘ื“ื™ื ื•ื—ื•ืกื›ื™ื ื”ืžื•ืŸ ื–ืžืŸ, ื•ื™ืฉ ื“ื‘ืจื™ื ืฉืœื ืขื•ื‘ื“ื™ื ืฉืฉื•ืื‘ื™ื ืื•ืชืš ืœืฉืขื•ืช, ื•ื‘ืจื•ืจ ืฉืื ื”ื™ื” ืืคืฉืจ ื”ื™ื™ื ื• ืžืฉืชืžืฉื™ื ื‘ AI ืจืง ืœืื•ืชื ื“ื‘ืจื™ื ืฉืขื•ื‘ื“ื™ื. ื•ื”ื›ื™ ืžืขื ื™ื™ืŸ ื›ืจื’ืข - ื”ืื ื‘ืขืชื™ื“ ื” AI ื™ืื›ืœ ืืช ื”ืžืชื›ื ืชื™ื (ื›ืžื• ืฉ C ื”ื—ืœื™ืฃ ืืช ืืกืžื‘ืœื™, ื›ืžื• ืฉื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื•ื•ื‘ ื”ื—ืœื™ืคื• ืืคืœื™ืงืฆื™ื•ืช ื“ืกืงื˜ื•ืค) ื•ื™ื™ืฉืืจื• ืจืง ืืจื›ื™ื˜ืงื˜ื™ื, ืžื ื”ืœื™ ืžื•ืฆืจ ื•ืคืจื•ืžืคื˜ื™ื? ืงืฉื” ืœื“ืขืช. ื‘ื™ื ืชื™ื™ื ืื ื™ ืžื—ื–ื™ืง ืืฆื‘ืขื•ืช.

ToCode
1 417
ืื™ืš ืœื”ืขืœื•ืช ืชืžื•ื ื” (ืื• ื›ืœ ืงื•ื‘ืฅ ืื—ืจ) ื‘ Next.JS ื‘ 2025 ืจื™ืืงื˜ 19 ื• next 15 ืขื•ื‘ื“ื™ื ื™ื—ื“ ื‘ื”ืจืžื•ื ื™ื” ื›ื“ื™ ืœืืคืฉืจ ืœื ื• ื”ืžืชื›ื ืชื™ื ื”ืคืฉื•ื˜ื™ื ืœื›ืชื•ื‘ ืืคืœื™ืงืฆื™ื•ืช Full Stack ื‘ืžื”ื™ืจื•ืช. ืื—ื“ ื”ืžืงื•ืžื•ืช ืฉืงื™ื‘ืœ ื˜ื™ืคื•ืœ ื‘ืื™ื ื˜ื’ืจืฆื™ื” ื”ื–ื• ื”ื•ื ื”ื˜ืคืกื™ื. ื‘ื•ืื• ื ืจืื” ืื™ืš ืขื•ื‘ื“ื™ื ืขื ื˜ืคืกื™ื ื‘ 2025 ื‘ React ื• Next ื•ื‘ืคืจื˜ ืื™ืš ืœื”ืขืœื•ืช ืชืžื•ื ื•ืช ืœืฉืจืช. ืงื•ื“ ื”ื˜ื•ืคืก ืจืขื™ื•ืŸ ืจืืฉื•ืŸ ืฉื”ื—ื‘ืจื™ื ื‘ืจื™ืืงื˜ ื•ื‘ Vercel ืžืžืœื™ืฆื™ื ืขืœื™ื• ื”ื•ื ืฉืœื ื—ื™ื™ื‘ื™ื ืœืฉืžื•ืจ ืืช ื”ืขืจื›ื™ื ืžื”ื˜ื•ืคืก ื‘ืžืฉืชื ื™ State. ื›ืŸ ืืคืฉืจ ืœืขืฉื•ืช ืืช ื–ื” ืื ืจื•ืฆื™ื ื•ื•ืœื™ื“ืฆื™ื”, ืื‘ืœ ื‘ื’ื“ื•ืœ ืื ื”ื•ื•ืœื™ื“ืฆื™ื” ืฉืœื›ื ืงื•ืจื™ืช ืจืง ื›ืฉืžื’ื™ืฉื™ื ืืช ื”ื˜ื•ืคืก ืืคืฉืจ ืœื—ื–ื•ืจ ืœื—ื™ื™ื ืฉืœืคื ื™ ื”ืกื˜ื™ื™ื˜ ื•ืคืฉื•ื˜ ืœื›ืชื•ื‘ ื˜ื•ืคืก ืขื ืฉืžื•ืช ืœืฉื“ื•ืช, ื•ืœื‘ื“ื•ืง ืืช ื”ืขืจื›ื™ื ื‘ืคื•ื ืงืฆื™ื” ืžืจื›ื–ื™ืช ืื—ืช. ืงื•ื“ ื”ื˜ื•ืคืก ืฉืœื™ ื ืจืื” ื›ืš:
'use client';

import { useActionState,  } from "react"
import { saveImage } from '@/lib/save-image';
export default function Home() {
  const [state, formAction, isPending] = useActionState(async (previousState: string, formData: FormData) => {
    const file = formData.get('image') as File;
    const description = formData.get('description') as string || "Default description";
    if (!file || file.size === 0) {
      return "No Image Selected"
    }
    if (!description) {
      return "No Description Provided"
    }    

    return await saveImage(file, description);    
  }, "");

  return (
    <div>
      <p>{state}</p>
      <form action={formAction}>
        <input type="text" name="description" />        
        <input type="file" name='image' />
        <input type="submit" value="Save Image" />
      </form>
    </div>
  )
}
ื”ืคื•ื ืงืฆื™ื” ืฉืื ื™ ืžืขื‘ื™ืจ ืœ useActionState ืื—ืจืื™ืช ื’ื ืขืœ ื•ื•ืœื™ื“ืฆื™ื”, ื’ื ืขืœ ืฉืœื™ื—ืช ื”ืžื™ื“ืข ืœืฉืจืช ื•ื’ื ืขืœ ื”ื’ื“ืจืช State ื›ืชื•ืฆืื” ืžืชืฉื•ื‘ืช ื”ืฉืจืช. ื”ืคืจืžื˜ืจ ื”ืื—ืจื•ืŸ ืœืคื•ื ืงืฆื™ื” ื”ื•ื ื”ืกื˜ื™ื™ื˜ ื”ืจืืฉื•ื ื™, ืœืคื ื™ ืฉื”ื˜ื•ืคืก ื”ื•ื’ืฉ, ื•ื”ื•ื ื™ื™ืฉืžืจ ื‘ืžืฉืชื ื” ื”ื—ื•ื–ืจ state. ืื—ืจื™ ื”ื’ืฉืช ื”ื˜ื•ืคืก ื”ืขืจืš ื”ื—ื•ื–ืจ ืžื”ืคื•ื ืงืฆื™ื” ื™ื•ื›ื ืก ืœืชื•ืš ืื•ืชื• ืžืฉืชื ื” state. ืžื ื’ื ื•ืŸ ื–ื” ืžืืคืฉืจ ืœื ื• ืœื”ืฆื™ื’ ื”ื•ื“ืขื” ืœืžืฉืชืžืฉื™ื ืื—ืจื™ ืฉื”ื˜ื•ืคืก ื”ื•ื’ืฉ, ืื• ืœื”ืจืื•ืช ืฉื’ื™ืื•ืช ืžืฆื“ ืฉืจืช ืื• ืฉื’ื™ืื•ืช ื•ื•ืœื™ื“ืฆื™ื”. ื‘ื˜ื•ืคืก ื”ื“ื•ื’ืžื” ืื ื™ ืžืฉืชืžืฉ ื‘ืžื—ืจื•ื–ืช ืจื’ื™ืœื” ื•ืคืฉื•ื˜ ืžืฆื™ื’ ืื•ืชื” ืขืœ ื”ืžืกืš ืžืขืœ ื”ื˜ื•ืคืก. ื‘ืจื™ื ื“ื•ืจ ื”ืจืืฉื•ืŸ ื–ื• ืชื”ื™ื” ืžื—ืจื•ื–ืช ืจื™ืงื” ื•ืื—ืจื™ ืฉื™ื•ื’ืฉ ื”ื˜ื•ืคืก ื™ื•ืคื™ืข ืฉื ื”ื˜ืงืกื˜ ืฉื™ื—ื–ื•ืจ ืžืฆื“ ื”ืฉืจืช, ืื• ื”ื•ื“ืขื•ืช ื”ืฉื’ื™ืื” ืฉื—ื•ื–ืจื•ืช ืžื”ืคื•ื ืงืฆื™ื” ืื ื™ืฉ ืฉื’ื™ืืช ื•ื•ืœื™ื“ืฆื™ื”. ืฆื“ ืฉืจืช ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืงื•ื“ ื”ื•ื ื”ืคื•ื ืงืฆื™ื” saveImage:
'use server';

import { read } from 'node:fs';
import fs from 'node:fs/promises';
export async function saveImage(
  image: File,
  description: string,
): Promise<string> {    
  console.log(\Saving image: ${image.name}\);
  const buffer = await image.stream().getReader().read(); 
  const data = buffer.value;
  if (!data) return "Missing Image File"

  const path = \./images/${image.name}\;
  const file = await fs.writeFile(path, data);

  return 'Image saved OK';
}

ืืœ ืชืฉืชืžืฉื• ื‘ื” ื‘ืžืขืจื›ืช ืืžื™ืชื™ืช ื›ื™ ื”ื™ื ืœื ืžื ืงื” ืืช ืฉื ื”ืงื•ื‘ืฅ, ืื‘ืœ ื›ืŸ ืืคืฉืจ ืœื”ื‘ื™ืŸ ืžื›ืืŸ ืืช ื”ืžื‘ื ื”: 1. ื”ืคื•ื ืงืฆื™ื” ืœื•ืงื—ืช ืืช ื”ืงื•ื‘ืฅ ื‘ืชื•ืจ ืื•ื‘ื™ืงื˜ File, ืฉื–ื” ืื•ื‘ื™ืงื˜ ืฉืžืฉื•ืชืฃ ื’ื ืœืฆื“ ืœืงื•ื— ื•ื’ื ืœืฆื“ ืฉืจืช. 2. ืžืชื•ืš ื” File ืืคืฉืจ ืœืงื—ืช stream ื•ื“ืจื›ื• ืœื”ื’ื™ืข ืœืชื•ื›ืŸ. 3. ืื ื”ื›ืœ ื‘ืกื“ืจ ื ื›ืชื•ื‘ ืืช ื”ืžื™ื“ืข ืœืงื•ื‘ืฅ ื•ื ื—ื–ื™ืจ ื”ื•ื“ืขื”.

ToCode
1 417
ื”ื‘ื•ื˜ ืฉืœ ื”ื˜ืœื’ืจื ืคืกืคืก ืืช ื”ืคื™ืกืงื” ื”ื›ื™ ื—ืฉื•ื‘ื” ื‘ืคื•ืกื˜, ืื– ืžื•ืกื™ืฃ ืื•ืชื”- ืื– ืžื” ืขื•ืฉื™ื? ื›ืœื™ AI ื”ื ืคื” ื›ื“ื™ ืœื”ื™ืฉืืจ, ืขื ื”ื™ืชืจื•ื ื•ืช ื•ื”ื—ืกืจื•ื ื•ืช ืฉืœื”ื. ืฉื™ืžื•ืฉ ื ื›ื•ืŸ ื‘ื›ืœื™ื ืืœื” ื‘ื”ื—ืœื˜ ื™ืฉืคืจ ืืช ืžื”ื™ืจื•ืช ื”ืคื™ืชื•ื— ืฉืœื›ื. ืฉื™ืžื•ืฉ ืœื ื ื›ื•ืŸ, ื’ื ืื ืžืœื”ื™ื‘ ื‘ืื•ืชื• ืจื’ืข, ื™ื›ื•ืœ ื‘ืงืœื•ืช ืœื’ืžื•ืจ ืœื ื• ืื—ืจ ืฆื”ืจื™ื™ื. ื‘ื™ื•ื ื—ืžื™ืฉื™ ืฉื‘ื•ืข ื”ื‘ื (ื” 27.3 ื‘ 20:00) ืขืจืŸ ื’ื•ืœื“ืžืŸ-ืžืœื›ื ื”ื–ืžื™ืŸ ืื•ืชื™ ืœื“ื‘ืจ ืื™ืชื• ื‘ื•ื•ื‘ื™ื ืจ ืขืœ ืฉื™ืžื•ืฉ ื ื›ื•ืŸ ื‘ื›ืœื™ AI ืœืคื™ืชื•ื— - ื ืจืื” ืฉื ืืช lovable, base44, ืงื•ืคื™ื™ืœื•ื˜, ื–ื ืงื•ื“, ืจื“ื™ ื•ืขื•ื“ ื”ืžื•ืŸ ื—ื‘ืจื™ื ื•ืืกืคืจ ืžื” ื•ืื™ืš ืขื•ื‘ื“ ืขื‘ื•ืจื™. ืžื•ื–ืžื ื™ื ืœื”ืฆื˜ืจืฃ ื‘ืœื™ื ืง: https://calendly.com/aumint/10xdevwith_ai?month=2025-03&date=2025-03-27

ToCode
1 417
ื•ืื– ืคืชื—ืชื™ ืืช ื”ืงื•ื“ ื‘ื™ืงืฉืชื™ ืž Lovable ืœื›ืชื•ื‘ ืืคืœื™ืงืฆื™ื” ืฉืชื™ืงื— ืงื™ืฉื•ืจ ืœ URL ื•ืชื™ื™ืฆืจ ืœื™ ื‘ื•ื—ืŸ ืื•ืฆืจ ืžื™ืœื™ื ืขืœ ื”ืžื™ืœื™ื ืฉื, ื›ื›ื” ื‘ืฉื‘ื™ืœ ืœืชืจื’ืœ ืืช ื”ืกืคืจื“ื™ืช. ื‘ืฉื‘ื™ืœ ืฉืœื ื™ื”ื™ื” ืงืœ ืžื“ื™ ื‘ื™ืงืฉืชื™ ืžืžื ื• ื’ื ืฉื™ื‘ืงืฉ ืืช ื”ืจืžื” ื”ื ื•ื›ื—ื™ืช ืฉืœื™ ื‘ืกืคืจื“ื™ืช ื•ื™ื‘ื ื” ื‘ื•ื—ืŸ ืขืœ ืžื™ืœื™ื ืžื” URL ืฉืžืชืื™ืžื•ืช ืœืจืžื” ืฉืœื™. ื–ื” ืœืงื— ืœื• ืงืฆืช ื–ืžืŸ ืื‘ืœ ื‘ืกื•ืฃ ื”ื•ื ื”ื•ืฆื™ื ืืช ื”ืืคืœื™ืงืฆื™ื” ื›ืืŸ: https://colorlingo-quizzy.lovable.app/ ืื—ืจื™ ื›ืžื” ืžืฉื—ืงื™ื ื”ืจื’ืฉืชื™ ืฉื”ื•ื ืงืฆืช ืžืจืžื” ืื– ื”ืœื›ืชื™ ืœืงื•ื“ ื›ื“ื™ ืœืžืฆื•ื ืืช ื”ืคื•ื ืงืฆื™ื” ื”ื‘ืื” ืฉืžื•ืฆื™ืื” ืืช ื”ืžื™ืœื™ื ืžื”ืœื™ื ืง:
// This would be populated with real data from the URL and filtered by level
// For now, we're creating dummy words for the custom quiz
const generateDummyWords = (url: string, level: SpanishLevel) => {
  // Extract domain name for demonstration
  let domain = '';
  try {
    domain = new URL(url).hostname.replace('www.', '');
  } catch {
    domain = 'example';
  }

  // These would actually come from scraping and NLP processing
  const allWordPairs = [
    // A1 level words (beginner)
    { english: "hello", spanish: "hola", level: "A1" },
    { english: "goodbye", spanish: "adiรณs", level: "A1" },
    { english: "thank you", spanish: "gracias", level: "A1" },
    { english: "please", spanish: "por favor", level: "A1" },
    
    // A2 level words (elementary)
    { english: "welcome", spanish: "bienvenido", level: "A2" },
    { english: "friend", spanish: "amigo", level: "A2" },
    { english: "family", spanish: "familia", level: "A2" },
    { english: "today", spanish: "hoy", level: "A2" },
    
    // B1 level words (intermediate)
    { english: "website", spanish: "sitio web", level: "B1" },
    { english: domain, spanish: domain, level: "B1" },
    { english: "language", spanish: "idioma", level: "B1" },
    { english: "content", spanish: "contenido", level: "B1" },
    
    // B2 level words (upper intermediate)
    { english: "experience", spanish: "experiencia", level: "B2" },
    { english: "develop", spanish: "desarrollar", level: "B2" },
    { english: "improve", spanish: "mejorar", level: "B2" },
    { english: "progress", spanish: "progreso", level: "B2" },
    
    // C1 level words (advanced)
    { english: "fluency", spanish: "fluidez", level: "C1" },
    { english: "proficient", spanish: "competente", level: "C1" },
    { english: "articulate", spanish: "articular", level: "C1" },
    { english: "communicate", spanish: "comunicar", level: "C1" },
    
    // C2 level words (proficiency)
    { english: "mastery", spanish: "dominio", level: "C2" },
    { english: "nuance", spanish: "matiz", level: "C2" },
    { english: "sophisticated", spanish: "sofisticado", level: "C2" },
    { english: "eloquent", spanish: "elocuente", level: "C2" },
  ];
  
  // Filter words based on selected level or lower
  const levelOrder = ["A1", "A2", "B1", "B2", "C1", "C2"];
  const levelIndex = levelOrder.indexOf(level);
  const filteredWords = allWordPairs.filter(word => 
    levelOrder.indexOf(word.level as SpanishLevel) <= levelIndex
  );
  
  // Shuffle the array to make it more random and take 10 words
  return filteredWords
    .sort(() => 0.5 - Math.random())
    .slice(0, 10)
    .map(({ english, spanish }) => ({ english, spanish }));
};
ื‘ืงื™ืฆื•ืจ ื”ื•ื ืœื’ืžืจื™ ืขื‘ื“ ืขืœื™ื™. ืืฃ ืžื™ืœื” ืžื”ืœื™ื ืง ืœื ืžื’ื™ืขื” ืœื‘ื•ื—ืŸ ืื•ืฆืจ ืžื™ืœื™ื. (ื”ื’ื™ืจืกื” ื”ืฉื ื™ื™ื” ืฉืœื• ื’ื ืœื ื”ื™ืชื” ื ื›ื•ื ื” ืื‘ืœ ืžืกื™ื‘ื” ืื—ืจืช). ืขื›ืฉื™ื• ื”ื‘ืื’ ื”ื–ื” ื™ื—ืกื™ืช ื ื—ืžื“ ื›ื™ ืงืœ ืœื–ื”ื•ืช ืื•ืชื•, ืื‘ืœ ืื ื™ ื—ื•ืฉื‘ ืฉื”ื•ื ืžืžื—ื™ืฉ ืืช ื”ื™ืฆื™ืจืชื™ื•ืช ืฉืœ ื” AI, ืฉื”ื™ื ื”ื›ื— ื•ื”ื—ื•ืœืฉื” ืฉืœื•: ื›ืฉื”ื•ื ืœื ื™ื•ื“ืข ื”ื•ื ืœื ืขื•ืฆืจ ืœืฉืื•ืœ ืื• ืœื—ืฉื•ื‘, ืคืฉื•ื˜ ืžืฉืœื™ื ืงื•ื“ ืžื”ืžืื’ืจ ื”ืื™ื ืกื•ืคื™ ืฉืœ ืงื•ื“ื™ื ืฉื”ื•ื ืื•ืžืŸ ืขืœื™ื”ื. ืžืื•ื“ ื™ืขื™ืœ ืœ POC-ื™ื ืงื˜ื ื™ื ื›ืฉืื ื—ื ื• ื‘ืชื•ืš ื”ืฆื•ื•ืช ืื• ื—ื•ืงืจื™ื ืจืขื™ื•ืŸ, ื”ืจื‘ื” ืคื—ื•ืช ืจืœื•ื•ื ื˜ื™ ืœืžืขืจื›ืช ืฉืฆืจื™ื›ื” ืœืคื’ื•ืฉ ืžืฉืชืžืฉื™ื ืืžื™ืชื™ื™ื.