- Added Custom Exams tab showing all exams from Generation page - Displays title, module badges, duration, and status - Added Create Exam button - Kept Exam Sessions tab for institutional sessions - Search filters across exams Made-with: Cursor
93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
import {
|
|
useLayoutEffect2
|
|
} from "./chunk-5ZB7HMJW.js";
|
|
import {
|
|
require_react
|
|
} from "./chunk-QCHXOAYK.js";
|
|
import {
|
|
__toESM
|
|
} from "./chunk-WOOG5QLI.js";
|
|
|
|
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
|
var React2 = __toESM(require_react(), 1);
|
|
var React22 = __toESM(require_react(), 1);
|
|
|
|
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
|
|
var React = __toESM(require_react(), 1);
|
|
var useReactEffectEvent = React[" useEffectEvent ".trim().toString()];
|
|
var useReactInsertionEffect = React[" useInsertionEffect ".trim().toString()];
|
|
|
|
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
|
var useInsertionEffect = React2[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
|
|
function useControllableState({
|
|
prop,
|
|
defaultProp,
|
|
onChange = () => {
|
|
},
|
|
caller
|
|
}) {
|
|
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
|
|
defaultProp,
|
|
onChange
|
|
});
|
|
const isControlled = prop !== void 0;
|
|
const value = isControlled ? prop : uncontrolledProp;
|
|
if (true) {
|
|
const isControlledRef = React2.useRef(prop !== void 0);
|
|
React2.useEffect(() => {
|
|
const wasControlled = isControlledRef.current;
|
|
if (wasControlled !== isControlled) {
|
|
const from = wasControlled ? "controlled" : "uncontrolled";
|
|
const to = isControlled ? "controlled" : "uncontrolled";
|
|
console.warn(
|
|
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
|
|
);
|
|
}
|
|
isControlledRef.current = isControlled;
|
|
}, [isControlled, caller]);
|
|
}
|
|
const setValue = React2.useCallback(
|
|
(nextValue) => {
|
|
var _a;
|
|
if (isControlled) {
|
|
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
|
|
if (value2 !== prop) {
|
|
(_a = onChangeRef.current) == null ? void 0 : _a.call(onChangeRef, value2);
|
|
}
|
|
} else {
|
|
setUncontrolledProp(nextValue);
|
|
}
|
|
},
|
|
[isControlled, prop, setUncontrolledProp, onChangeRef]
|
|
);
|
|
return [value, setValue];
|
|
}
|
|
function useUncontrolledState({
|
|
defaultProp,
|
|
onChange
|
|
}) {
|
|
const [value, setValue] = React2.useState(defaultProp);
|
|
const prevValueRef = React2.useRef(value);
|
|
const onChangeRef = React2.useRef(onChange);
|
|
useInsertionEffect(() => {
|
|
onChangeRef.current = onChange;
|
|
}, [onChange]);
|
|
React2.useEffect(() => {
|
|
var _a;
|
|
if (prevValueRef.current !== value) {
|
|
(_a = onChangeRef.current) == null ? void 0 : _a.call(onChangeRef, value);
|
|
prevValueRef.current = value;
|
|
}
|
|
}, [value, prevValueRef]);
|
|
return [value, setValue, onChangeRef];
|
|
}
|
|
function isFunction(value) {
|
|
return typeof value === "function";
|
|
}
|
|
var SYNC_STATE = Symbol("RADIX:SYNC_STATE");
|
|
|
|
export {
|
|
useControllableState
|
|
};
|
|
//# sourceMappingURL=chunk-PP5CJGVQ.js.map
|