+ );
+};
+
+export default AddConfidential;
\ No newline at end of file
diff --git a/src/taskpane/components/InsertTitles.tsx b/src/taskpane/components/InsertTitles.tsx
new file mode 100644
index 00000000..d8272f27
--- /dev/null
+++ b/src/taskpane/components/InsertTitles.tsx
@@ -0,0 +1,172 @@
+import * as React from "react";
+import {
+ Button
+} from "@fluentui/react-components";
+import {
+ TextBulletListRegular
+} from "@fluentui/react-icons";
+import { useStatusContext } from "./App";
+import { useCommonStyles } from "./commonStyles";
+
+export const InsertTitles: React.FC = () => {
+ const styles = useCommonStyles();
+ const {
+ statusMessage, setStatusMessage,
+ statusType, setStatusType,
+ isProcessing, setIsProcessing
+ } = useStatusContext();
+
+ const collectAndInsertTitles = async () => {
+ setIsProcessing(true);
+ try {
+ await PowerPoint.run(async (context) => {
+ try {
+ // Get the selected shape
+ const selectedShapes = context.presentation.getSelectedShapes();
+ selectedShapes.load("items");
+ await context.sync();
+
+ // Check if any shape is selected
+ if (selectedShapes.items.length === 0) {
+ setStatusMessage("Please select a text box to insert slide titles.");
+ setStatusType("warning");
+ return;
+ }
+
+ // Get the first selected shape
+ const selectedShape = selectedShapes.items[0];
+
+ // Check if the selected shape has a text frame
+ selectedShape.load("textFrame");
+ await context.sync();
+
+ if (!selectedShape.textFrame) {
+ setStatusMessage("Please select a text box to insert slide titles.");
+ setStatusType("warning");
+ return;
+ }
+
+ // Get all slides in the presentation
+ const slides = context.presentation.slides;
+ slides.load("items");
+ await context.sync();
+
+ // Collect all slide titles using a simple approach
+ let titleText = "";
+ let titlesCollected = 0;
+
+ // Process each slide
+ for (let i = 0; i < slides.items.length; i++) {
+ try {
+ const slide = slides.items[i];
+
+ // Load only necessary shape properties
+ slide.load("shapes");
+ await context.sync();
+
+ // Get title text using a simplified approach
+ // This gets all the shapes and looks for one with text content positioned at the top
+ const shapes = slide.shapes;
+ shapes.load("items");
+ await context.sync();
+
+ // Look for shapes with text content
+ for (let j = 0; j < shapes.items.length; j++) {
+ try {
+ const shape = shapes.items[j];
+
+ // Only load textFrame property initially
+ shape.load("textFrame");
+ await context.sync();
+
+ // Only proceed with shapes that have text frames
+ if (shape.textFrame) {
+ // Load text range to see if there's content
+ shape.textFrame.load("textRange");
+ await context.sync();
+
+ if (shape.textFrame.textRange) {
+ shape.textFrame.textRange.load("text");
+ await context.sync();
+
+ const shapeText = shape.textFrame.textRange.text;
+
+ // Check if the shape has text and might be a title
+ if (shapeText && shapeText.trim() !== "") {
+ // Load position to see if it's at the top
+ shape.load("top");
+ await context.sync();
+
+ // Titles are usually at the top of the slide
+ // Since we can't directly identify a title placeholder,
+ // we're using position as a heuristic
+ if (shape.top < 150) {
+ // Add the title to our collection
+ // titleText += `Slide ${i+1}: ${shapeText}\n`;
+ titleText += `${shapeText}\n`;
+ titlesCollected++;
+ break; // Only use the first potential title shape on each slide
+ }
+ }
+ }
+ }
+ } catch (shapeError) {
+ console.error(`Error processing shape on slide ${i+1}:`, shapeError);
+ // Continue to the next shape
+ continue;
+ }
+ }
+ } catch (slideError) {
+ console.error(`Error processing slide ${i+1}:`, slideError);
+ // Continue to the next slide
+ continue;
+ }
+ }
+
+ // Insert the collected titles into the selected text frame
+ if (titleText) {
+ // Make sure we have a textRange on the selected shape
+ selectedShape.textFrame.load("textRange");
+ await context.sync();
+
+ selectedShape.textFrame.textRange.text = titleText;
+ await context.sync();
+
+ setStatusMessage(`Collected and inserted ${titlesCollected} slide titles.`);
+ setStatusType("success");
+ } else {
+ setStatusMessage("No slide titles found to insert.");
+ setStatusType("warning");
+ }
+ } catch (innerError) {
+ console.error("Inner error:", innerError);
+ throw innerError; // Re-throw to outer catch
+ }
+ });
+ } catch (error) {
+ setStatusMessage(`Error: ${error.message}`);
+ setStatusType("error");
+ console.error("Collect titles error:", error);
+ } finally {
+ setIsProcessing(false);
+ }
+ };
+
+ return (
+