Feature/v2/redact (#5249)

# Description of Changes

- Add manual redaction and added it to the right rail in the viewer

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing)
for more details.
This commit is contained in:
EthanHealy01
2026-01-05 15:12:14 +00:00
committed by GitHub
parent 991d158cb8
commit 0c96133544
34 changed files with 4210 additions and 1237 deletions
@@ -117,11 +117,13 @@ interface ViewerContextType {
registerImmediateZoomUpdate: (callback: (percent: number) => void) => () => void;
registerImmediateScrollUpdate: (callback: (currentPage: number, totalPages: number) => void) => () => void;
registerImmediateSpreadUpdate: (callback: (mode: SpreadMode, isDualPage: boolean) => void) => () => void;
registerImmediatePanUpdate: (callback: (isPanning: boolean) => void) => () => void;
// Internal - for bridges to trigger immediate updates
triggerImmediateScrollUpdate: (currentPage: number, totalPages: number) => void;
triggerImmediateZoomUpdate: (zoomPercent: number) => void;
triggerImmediateSpreadUpdate: (mode: SpreadMode, isDualPage?: boolean) => void;
triggerImmediatePanUpdate: (isPanning: boolean) => void;
// Action handlers - call EmbedPDF APIs directly
scrollActions: ScrollActions;
@@ -140,6 +142,10 @@ interface ViewerContextType {
type: K,
ref: BridgeRef<BridgeStateMap[K], BridgeApiMap[K]>
) => void;
// Save changes function - registered by EmbedPdfViewer
applyChanges: (() => Promise<void>) | null;
setApplyChanges: (fn: (() => Promise<void>) | null) => void;
}
export const ViewerContext = createContext<ViewerContextType | null>(null);
@@ -163,6 +169,19 @@ export const ViewerProvider: React.FC<ViewerProviderProps> = ({ children }) => {
// Bridge registry - bridges register their state and APIs here
const bridgeRefs = useRef<ViewerBridgeRegistry>(createBridgeRegistry());
// Apply changes function - registered by EmbedPdfViewer
const applyChangesRef = useRef<(() => Promise<void>) | null>(null);
const setApplyChanges = useCallback((fn: (() => Promise<void>) | null) => {
applyChangesRef.current = fn;
}, []);
const applyChanges = useCallback(async () => {
if (applyChangesRef.current) {
await applyChangesRef.current();
}
}, []);
const {
register: registerImmediateZoomUpdate,
trigger: triggerImmediateZoomInternal,
@@ -175,6 +194,10 @@ export const ViewerProvider: React.FC<ViewerProviderProps> = ({ children }) => {
register: registerImmediateSpreadUpdate,
trigger: triggerImmediateSpreadInternal,
} = useImmediateNotifier<[SpreadMode, boolean]>();
const {
register: registerImmediatePanUpdate,
trigger: triggerImmediatePanInternal,
} = useImmediateNotifier<[boolean]>();
const triggerImmediateZoomUpdate = useCallback(
(percent: number) => {
@@ -197,6 +220,13 @@ export const ViewerProvider: React.FC<ViewerProviderProps> = ({ children }) => {
[triggerImmediateSpreadInternal]
);
const triggerImmediatePanUpdate = useCallback(
(isPanning: boolean) => {
triggerImmediatePanInternal(isPanning);
},
[triggerImmediatePanInternal]
);
const registerBridge = useCallback(
<K extends BridgeKey>(
type: K,
@@ -335,9 +365,11 @@ export const ViewerProvider: React.FC<ViewerProviderProps> = ({ children }) => {
registerImmediateZoomUpdate,
registerImmediateScrollUpdate,
registerImmediateSpreadUpdate,
registerImmediatePanUpdate,
triggerImmediateScrollUpdate,
triggerImmediateZoomUpdate,
triggerImmediateSpreadUpdate,
triggerImmediatePanUpdate,
// Actions
scrollActions,
@@ -353,6 +385,10 @@ export const ViewerProvider: React.FC<ViewerProviderProps> = ({ children }) => {
// Bridge registration
registerBridge,
// Apply changes
applyChanges,
setApplyChanges,
};
return (